精华内容
下载资源
问答
  • 这个问题和最大化两个不重叠子数组和类似,即还是想办法求得区间[0...i]和[i+1...n-1]的最大/小连续子数组和...那么就对两个区间都分别预处理好最大值和最小值,答案一定是其中一个的最大值与另一个的最小值之差。 i...

    http://www.lintcode.com/zh-cn/problem/maximum-subarray-difference/#

    这个问题和最大化两个不重叠子数组和类似,即还是想办法求得区间[0...i][i+1...n-1]的最大/小连续子数组和,只是不同的是要最大化相减的绝对值。那么就对两个区间都分别预处理好最大值和最小值,答案一定是其中一个的最大值与另一个的最小值之差。

    int maxDiffSubArrays(vector<int> &nums) {
        if (nums.empty()) return 0;
        
        int n = nums.size();
        
        // 思路:对所有的i,分别预处理好区间[0...i]和[i+1...n-1]的子数组最大值和最小值
        // 然后结果是max(left_max[i] - right_min[i+1]), max(left_min[i] - right_max[i])两个较大的那个
        vector<int> left_max(n), left_min(n), right_max(n), right_min(n);
        
        int prev_max = nums[0], prev_min = nums[0], cur_max, cur_min;
        left_max[0] = nums[0]; left_min[0] = nums[0];
        for (int i = 1; i < n - 1; ++i) {
            if (prev_max > 0) cur_max = prev_max + nums[i];
            else cur_max = nums[i];
            if (prev_min < 0) cur_min = prev_min + nums[i];
            else cur_min = nums[i];
            left_max[i] = max(left_max[i-1], cur_max);
            left_min[i] = min(left_min[i-1], cur_min);
            prev_max = cur_max;
            prev_min = cur_min;
        }
        
        prev_max = nums[n-1]; prev_min = nums[n-1];
        right_max[n-1] = nums[n-1]; right_min[n-1] = nums[n-1];
        for (int i = n - 2; i > 0; --i) {
            if (prev_max > 0) cur_max = prev_max + nums[i];
            else cur_max = nums[i];
            if (prev_min < 0) cur_min = prev_min + nums[i];
            else cur_min = nums[i];
            right_max[i] = max(right_max[i+1], cur_max);
            right_min[i] = min(right_min[i+1], cur_min);
            prev_max = cur_max;
            prev_min = cur_min;
        }
        
        int ret = 0;
        for (int i = 0; i < n - 1; ++i) {
            ret = max(ret, max(abs(left_max[i]-right_min[i+1]), abs(left_min[i]-right_max[i+1])));
        }
        return ret;
    }

    转载于:https://www.cnblogs.com/ilovezyg/p/7519090.html

    展开全文
  • 同时维护当前下标数组的最大值最小值即可。 class Solution { public: int maxAbsoluteSum(vector<int>& nums) { int n = nums.size(); if(n==0) return 0; vector<int> maxSum(n); ...

    同时维护当前下标的数组的最大值和最小值即可。

    class Solution {
    public:
        int maxAbsoluteSum(vector<int>& nums) {
            int n = nums.size();
            if(n==0) return 0;
            vector<int> maxSum(n);
            vector<int> minSum(n);
            int res = abs(nums[0]);
            maxSum[0] = nums[0], minSum[0] = nums[0];
            for(int i=1;i<n;i++){
                maxSum[i] = max(nums[i],maxSum[i-1]+nums[i]);
                minSum[i] = min(nums[i],minSum[i-1]+nums[i]);
                res = max(res,max(abs(maxSum[i]),abs(minSum[i])));
            }
            return res;
        }
    };

    纯模拟题目 

    class Solution {
    public:
        int minimumLength(string s) {
            int i = 0, j = s.size()-1;
            while(i<j&&s[i]==s[j]){
                while(i+1<j&&s[i]==s[i+1]) i++;
                while(j-1>i&&s[j]==s[j-1]) j--;
                i++;
                j--;
            }
            return j-i+1;
        }
    };

     

    展开全文
  • 练习4-3求给定精度简单交错序列部分和(15分) 本题要求编写程序,计算序列部分和...在一行中按照“sum = S”格式输出部分和的值S,精确到小数点后六位。题目保证计算结果不超过精度范围。 输入样例1: 4E-2 ...

    练习4-3 求给定精度的简单交错序列部分和 (15 分)

    本题要求编写程序,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最后一项的绝对值不大于给定精度eps。

    输入格式:

    输入在一行中给出一个正实数eps。

    输出格式:

    在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后六位。题目保证计算结果不超过双精度范围。

    输入样例1:

    4E-2
    

    输出样例1:

    sum = 0.854457
    

    输入样例2:

    0.02
    

    输出样例2:

    sum = 0.826310
    #include "stdio.h"
    main()
    {
    	double sum=0.0,sn=1.0,eps,i,flag=-1;
    	scanf("%lf",&eps);
    	for(i=1;sn>eps;i++)
    	{
    		flag*=-1;//符号转换
    		sn=1/(i*3-2);//各项绝对值计算
    		sum+=sn*flag;//求和		
    	}
    	printf("sum = %lf\n",sum);//输出	 
    } 

    练习4-6 猜数字游戏 (15 分)

    猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。如果在到达N次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。

    输入格式:

    输入第一行中给出两个不超过100的正整数,分别是游戏机产生的随机数、以及猜测的最大次数N。最后每行给出一个用户的输入,直到出现负数为止。

    输出格式:

    在一行中输出每次猜测相应的结果,直到输出猜对的结果或“Game Over”则结束。

    输入样例:

    58 4
    70
    50
    56
    58
    60
    -2
    

    输出样例:

    Too big
    Too small
    Too small
    Good Guess!
    #include "stdio.h"
    int main()
    {
        int count=0,a,b,N;
        scanf("%d %d", &a, &N);//随机给出被猜数字和最大猜测次数 
        //开始循环猜测 
    	for(;count<=N;) 
    	{
    		 
    		count++;//次数计数
    		if(count>N) {printf("Game Over\n");break;}//超过次数退出程序,否则输入猜测数字 
    		scanf("%d",&b);//输入猜测的数字
    		//判断猜数字情况 
    		if(b<0) { printf("Game Over\n");break;	}
    		else if(b>a) printf("Too big\n");
    		else if(b<a) printf("Too small\n");	
    		else if(b==a)
    			{
    				if(count==1){printf("Bingo!\n");break;}
    				else if(count<=N){printf("Good Guess!\n");break;}
    			}
    	}
    	
    	return 0;		 
    } 

     

    拓展应用:随机数由计算机生成,用户自定义猜游戏次数(难度控制),每次用户输入1个数据,程序给出相对于随机数的大小提示,给出猜数字游戏的结果。

    #include "stdio.h"
    #include "math.h"
    #include "stdlib.h"
    #include "time.h"
    #include "windows.h" 
    void win_contr()
    {
    		/*
            颜色属性由两个十六进制数字指定, 第一个为背景色, 第二个为前景色。
            每个数字可以为下列值之一:
            黑色 = 0      蓝色 = 1      绿色 = 2      湖蓝色 = 3
            红色 = 4      紫色 = 5      黄色 = 6      白色 = 7
            灰色 = 8      淡蓝色=9      淡绿色=A      白色=C
            淡紫色=D      淡黄色=E      亮白色=F
        */
        //设置背景色为灰色,文字颜色为淡黄色
        system("color 47");
        //设置窗口大小,cols 宽度  lines 高度 
    	system("mode con cols=30 lines=20");
    }
    main()
    {	
    	win_contr();
    	int count=0,a,b,i,N;
    	printf("请输入最大猜游戏次数:");//次数越小难度越大 
    	scanf("%d",&N);//给出最大猜游戏次数 
    	srand((unsigned)time(NULL));//生成时间种子 
    	a=rand()%100+1;//生成1-100随机正整数 
    	//printf("%d %d\n",a,N);//查看生成的随机数和最大猜游戏次数 
    	printf("\nGame begin!\n");//猜游戏开始 
        printf("\n请输入1-100的正整数!\n\n");//猜游戏开始
    	for(;count<=N;)
    	{
    		count++;//次数计数
    		if(count>N) //超过次数退出程序,否则输入猜测数字
            {
                printf("Game Over\n");
                printf("The Aanswer is :%d\n\n",a);//查看结果 
                break;
            } 
    		scanf("%d",&b);//输入猜测的数字
    		//判断猜数字情况 
    		if(b<0) { 
    			printf("Game Over\n");
    			printf("The Aanswer is :%d\n\n",a);//查看结果 
    			break;}
    		else if(b>a) printf("Too big\n");
    		else if(b<a) printf("Too small\n");	
    		else if(b==a)
    			{
    				if(count==1){printf("Bingo!\n");break;}
    				else if(count<=N){printf("Good Guess!\n");break;}
    			}
    	}
    	system("pause\n");
    	printf("\n\t【】任意键继续\n\t【e】退出\n");
    	fflush(stdin);
    	char c=getchar();
    	//fflush(stdin);
    	if(c=='e') 
    		return 0;
    	else
    		main() ;		 
    } 

    练习4-7 求e的近似值 (15 分)

    自然常数e可以用级数1+1/1!+1/2!+⋯+1/n!来近似计算。本题要求对给定的非负整数n,求该级数的前n项和。

    输入格式:

    输入第一行中给出非负整数n(≤1000)。

    输出格式:

    在一行中输出部分和的值,保留小数点后八位。

    输入样例:

    10
    

    输出样例:

    2.71828180
    #include "stdio.h"
    int main()
    {
    	int n,i,j;
    	double sum=1.0,k;  //sum作为求和结果,初值为1.0,k为第j项的阶乘 
    	scanf("%d",&n);	   //输入数据 
    	printf("\n");
    	for(i=1;i<=n;i++)  //循环求和 
    		{
    			k=1.0;
    			for(j=1;j<=i;j++) //循环求阶乘 
    			k=(double)j*k;
    			//printf("i = %d j = %d k = %.0lf  ",i,j,k);//验证阶乘 
    			sum+=1.0/k;
    			//printf("sum = %.8lf\n",sum);//验证求和
    		}
    	printf("%.8lf\n",sum);	//输出结果 ,8位小数 
    }

    练习4-10 找出最小值 (20 分)

    本题要求编写程序,找出给定一系列整数中的最小值。

    输入格式:

    输入在一行中首先给出一个正整数n,之后是n个整数,其间以空格分隔。

    输出格式:

    在一行中按照“min = 最小值”的格式输出n个整数中的最小值。

    输入样例:

    4 -2 -123 100 0
    

    输出样例:

    min = -123
    #include "stdio.h"
    int main()
    {
    	int i,n,min,a[n];
    	scanf("%d",&n);	   //输入数据 n
    	for(i=0;i<n;i++)  //循环输入,存入数组 
    		scanf("%d",&a[i]);
    	min=a[0];     //假设第一个数值最小 
    	for(i=1;i<n;i++) //循环比较a[i]和 min 将小值赋给min 
    		if(min>a[i]) min=a[i];
    	printf("min = %d\n",min);	//输出结果 
    }

    练习4-11 统计素数并求和 (20 分)

    本题要求统计给定整数M和N区间内素数的个数并对它们求和。

    输入格式:

    输入在一行中给出两个正整数M和N(1≤M≤N≤500)。

    输出格式:

    在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。

    输入样例:

    10 31
    

    输出样例:

    7 143
    #include "stdio.h"
    #include "math.h"
    int main()
    {
    	int m,n,i,j,count=0,sum=0;
    	scanf("%d%d",&m,&n);	   //输入数据 m,n
    	if(m>n||m<=0||n<=0||n>500) return 0; //判断给出数据是否满足题目要求 
    	else
    	{
    		for(i=m;i<=n;i++)  //循环 m->n 间所有整数
    			{
    				for(j=2;j<=sqrt(i);j++) // 判断是否为素数 
    				if(i%j==0)break;		// 满足条件不是素数 
    				if(j>sqrt(i)){count++; sum+=i;} //是素数,计数、求和 
    			}
    	}
    	printf("%d %d\n",count,sum);	//输出结果 
    	return 0;
    }

    习题4-1 求奇数和 (15 分)

    本题要求计算给定的一系列正整数中奇数的和。

    输入格式:

    输入在一行中给出一系列正整数,其间以空格分隔。当读到零或负整数时,表示输入结束,该数字不要处理。

    输出格式:

    在一行中输出正整数序列中奇数的和。

    输入样例:

    8 7 4 3 70 5 6 101 -1
    

    输出样例:

    116
    #include "stdio.h"
    int main()
    {
    	int n,sum=0;
    	scanf("%d",&n);	   //输入数据 n
    	while(n>0)  //输入数据大于 0 
    	{
    		if(n%2)	sum+=n; //为奇数 则求和 
    		scanf("%d",&n); //输入下一个数据 
    	}
    	printf("%d\n",sum);	//输出结果 
    	return 0;
    }

    习题4-2 求幂级数展开的部分和 (20 分)

    已知函数e​x​​可以展开为幂级数1+x+x​2​​/2!+x​3​​/3!+⋯+x​k​​/k!+⋯。现给定一个实数x,要求利用此幂级数部分和求e​x​​的近似值,求和一直继续到最后一项的绝对值小于0.00001。

    输入格式:

    输入在一行中给出一个实数x∈[0,5]。

    输出格式:

    在一行中输出满足条件的幂级数部分和,保留小数点后四位。

    输入样例:

    1.2
    

    输出样例:

    3.3201
    #include "stdio.h"
    #include "math.h"
    int main()
    {
    	int i,j;
    	double x,eps,sum=1.0,jiecheng;
    	scanf("%lf",&x); //输入数据 x
    	eps=x;	  		 //输eps作为精度值,初值为 x; 
    	for(i=1;eps>=0.00001;i++)//设置循环,eps<0.00001 时结束 
    	{
    		jiecheng=1.0;       //阶乘初值  
    		for(j=1;j<=i;j++)  //计算分母 阶乘 
    	 			jiecheng*=(double)j;
    		eps=pow(x,(double)i)/jiecheng;  // i次幂用函数pow(x,i) 
    		sum+=eps;		//求和 
    	}
    	printf("%.4lf\n",sum);	//输出结果 
    	return 0;
    }

    习题4-3 求分数序列前N项和 (15 分)

    本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+... 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。

    输入格式:

    输入在一行中给出一个正整数N。

    输出格式:

    在一行中输出部分和的值,精确到小数点后两位。题目保证计算结果不超过双精度范围。

    输入样例:

    20
    

    输出样例:

    32.66
    #include "stdio.h"
    int main()
    {
    	int i,x,y,n,t;
    	double sum=0.0;
    	scanf("%d",&n); //输入数据 n
    	for(i=1;i<=n;i++)//设置循环
    	{
    		if(i==1){x=2;y=1;}     // 计算第 i 项的分子、分母 
    		else {t=x+y;y=x;x=t;}
    		sum+=(double)x/y;		//求和 
    	}
    	printf("%.2lf\n",sum);	//输出结果 
    	return 0;
    }

    习题4-4 特殊a串数列求和 (20 分)

    给定两个均不超过9的正整数a和n,要求编写程序求a+aa+aaa++⋯+aa⋯a(n个a)之和。

    输入格式:

    输入在一行中给出不超过9的正整数a和n。

    输出格式:

    在一行中按照“s = 对应的和”的格式输出。

    输入样例:

    2 3
    

    输出样例:

    s = 246
    #include "stdio.h"
    int main()
    {
    	int i,a,n;
    	double sum=0.0,res=0.0;
    	scanf("%d%d",&a,&n); //输入数据 a,n
    	for(i=0;i<n;i++)//设置循环
    		{	sum=sum*10+a;  //求每一项 
    			res+=sum;   //求和 
    		}	  
    	printf("%.0lf\n",res);	//输出结果 
    	return 0;
    }

    习题4-5 换硬币 (20 分)

    将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?

    输入格式:

    输入在一行中给出待换的零钱数额x∈(8,100)。

    输出格式:

    要求按5分、2分和1分硬币的数量依次从大到小的顺序,输出各种换法。每行输出一种换法,格式为:“fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”。最后一行输出“count = 换法个数”。

    输入样例:

    13
    

    输出样例:

    fen5:2, fen2:1, fen1:1, total:4
    fen5:1, fen2:3, fen1:2, total:6
    fen5:1, fen2:2, fen1:4, total:7
    fen5:1, fen2:1, fen1:6, total:8
    count = 4

    按题目输出(数量从大到小输出)

    #include "stdio.h"
    int main()
    {
    	int i,j,k,n,count=0;
    	scanf("%d",&n); //输入数据 n
    	for(i=n/5;i>0;i--)//设置循环 fen5
    		for(j=n/2;j>0;j--)//设置循环 fen2
    			for(k=n;k>0;k--)//设置循环 fen1
    			if(i*5+j*2+k==n)
    			{
    				printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",i,j,k,i+j+k);	//输出结果
    				count++;
    			}
    	printf("count = %d\n",count);	 
    	return 0;
    }

    数量从小到大输出

    #include "stdio.h"
    int main()
    {
    	int i,j,k,n,count=0;
    	scanf("%d",&n); //输入数据 n
    	for(i=1;i<=n/5;i++)//设置循环 fen5
    		for(j=1;j<=n/2;j++)//设置循环 fen2
    			for(k=1;k<=n;k++)//设置循环 fen1
    			if(i*5+j*2+k==n)
    			{
    				printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",i,j,k,i+j+k);	//输出结果
    				count++;
    			}
    	printf("count = %d\n",count);	 
    	return 0;
    }

    习题4-6 水仙花数 (20 分)

    水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=1​3​​+5​3​​+3​3​​。 本题要求编写程序,计算所有N位水仙花数。

    输入格式:

    输入在一行中给出一个正整数N(3≤N≤7)。

    输出格式:

    按递增顺序输出所有N位水仙花数,每个数字占一行。

    输入样例:

    3
    

    输出样例:

    153
    370
    371
    407
    #include "stdio.h"
    #include "math.h"
    int main()
    {
    	int j,n;
    	double i,k,m,sum,res;
    	scanf("%d",&n); //输入数据 n
    	sum=pow(10,n-1); //N位数 初始值 例 3位数 初值100,肯定不是水仙数 
    	for(i=sum+1;i<sum*10;i++) //N位数 最大值 初值 sum*10-1 
    		{
    			m=i;     //用于求每位数值
    			res=0.0; //记录每位数字的N次幂的和  
    			for(j=0;j<=n;j++) 
    			{
    				k=(int)m%10;
    				m/=10;
    				res+=pow(k,n);
    			}
    			if(i==res)printf("%.0lf\n",i); //满足条件则为水仙数,输出结果 
    		}	 
    	return 0;
    }

    习题4-7 最大公约数和最小公倍数 (15 分)

    本题要求两个给定正整数的最大公约数和最小公倍数。

    输入格式:

    输入在一行中给出两个正整数M和N(≤1000)。

    输出格式:

    在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。

    输入样例:

    511 292
    

    输出样例:

    73 2044
    #include "stdio.h"
    #include "math.h"
    int main()
    {
    	int i,m,n,t,maxg,minb,flag=0;//flag用于确定是否已经取得最大公约数 
    	scanf("%d%d",&m,&n); //输入数据 m,n
    	t=m>n?n:m; //两数中的小数赋值给 t ,用于确定循环终点 
    	minb=m*n;  //假设两数没有公约数,最小公倍数为两数乘积 
    	for(i=t;i>=sqrt(t);i--) //N位数 最大值 初值 sum*10-1 {
    			if(m%i==0&&n%i==0) 				
    				if(flag==0){maxg=i;flag++;} //取得最大公约数后,不再赋值给 maxg 
    			minb/=maxg; //最小公倍数 即为 两数乘积除最大公约数 
    	printf("%d %d\n",maxg,minb); //输出结果 	 
    	return 0;
    }

     

    展开全文
  • 一、绝对值不超过限制最长连续子数组长度 ...通过维护一个动态窗口,在滑动窗口中快速求出最大值最小值,若满足limit限制。求滑动窗口大小。 这里通过left、right两个指针维护滑窗,注...

    一、绝对值不超过限制的最长连续子数组的长度

    给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit 。

    如果不存在满足条件的子数组,则返回 0 。

     

    示例 1:

    输入:nums = [8,2,4,7], limit = 4
    输出:2 

     通过维护一个动态窗口,在滑动窗口中快速的求出最大值与最小值,若满足limit限制。求滑动窗口的大小。

    这里通过left、right两个指针维护滑窗,注意:若滑窗满足限制则将right右移动,若滑窗不满足限制需要left右移动。

    代码实现:

    class Solution {
    public:
        int longestSubarray(vector<int>& nums, int limit) {
            int left= 0;
            int right=0;
            multiset<int> st;
            int res = 0;
            while(right<nums.size()){
                st.insert(nums[right]);
                while(*st.rbegin()-*st.begin()>limit){
                    st.erase(st.find(nums[left]));
                    left++;
                }
                res = max(res,right-left+1);
                right++;
            }
            return res;
    
        }
    };

    C++中的multiset维护了序列有序且可以含有相同数字,红黑树实现。求问:平时用的Python2中实在没想到有什么现成的数据结构等同于multiset呢?

     

    二、含有重复数字的数组: 

    给你一个整数数组 nums 和两个整数 k 和 t 。请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] - nums[j]) <= t ,同时又满足 abs(i - j) <= k 。

    如果存在则返回 true,不存在返回 false。

     

    示例 1:

    输入:nums = [1,2,3,1], k = 3, t = 0
    输出:true
    示例 2:

    输入:nums = [1,0,1,1], k = 1, t = 2
    输出:true
    示例 3:

    输入:nums = [1,5,9,1,5,9], k = 2, t = 3
    输出:false
     

    提示:

    0 <= nums.length <= 2 * 104
    -231 <= nums[i] <= 231 - 1
    0 <= k <= 104
    0 <= t <= 231 - 1

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/contains-duplicate-iii
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    这道题与(一)比起来。相同点:都是基于滑窗进行判断是否满足题述条件,且滑窗要“快速”取得最大最小值。不同点:该题目要求在满足最大最小值条件同时窗口大小满足<=k

    class Solution {
    public:
        bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
            int left = 0;
            int right = 0;
            set<long long> st;
            bool res = false;
            while(right<nums.size()){            
                if(right-left>k){                
                    st.erase(nums[left]);
                    left++;
                }          
                //对于新进的num[right]与t求差值 ,返回第一个大于等于nums[right]-t的指针
                auto a = st.lower_bound((long long) nums[right] - t);
                if (a!=st.end() && abs(*a-nums[right])<=t)
                {
                    return true;
                }
                st.insert(nums[right]);
                right++;
            }
            return false;
    
        }
    };

    窗口大小:过大调整left++

    三、无重复字符的最长子串:

    给定一个字符串,求其中不含有重复的字符的子串中最长的那个是多长。

    分析:对于子串从i开始到j结束,这其中不含有重复字符。此时将i右移,减少子串长度,继续右移j,判断新的子串是否更长。

    这里通过右移 i,j 形成滑窗解决题目问题。

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

     

    示例 1:

    输入: s = "abcabcbb"
    输出: 3 
    解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
    示例 2:

    输入: s = "bbbbb"
    输出: 1
    解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
    示例 3:

    输入: s = "pwwkew"
    输出: 3
    解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
         请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
    示例 4:

    输入: s = ""
    输出: 0
     

    提示:

    0 <= s.length <= 5 * 104
    s 由英文字母、数字、符号和空格组成

    class Solution(object):
        def lengthOfLongestSubstring(self, s):
            """
            :type s: str
            :rtype: int
            """
            left = 0
            right = 0
            sch = set()
            res = 0
            while left<len(s):
                while right<len(s) and  s[right] not in sch:
                    sch.add(s[right])
                    right += 1
                res = max(right-left,res)
                sch.remove(s[left])
                left += 1
            return res

    时间复杂度O(N) 空间复杂度O(K)K为字符集中字符个数

     

    展开全文
  • 首选,要使任意两个元素绝对值小于等于limit,也就是这个子数组中绝对值最大的两个元素小于等于limit,而我们根据数学知识很快可以知道,区间范围内最大值最小值的绝对值之差最大, 所以这个题目也就转换为...
  • 在这个例子中,我使用是虹膜数据:在此示例之前,请注意使用PCA作为特征选择工具时基本思想是根据系数(载荷)大小(从绝对值的最大值最小值)选择变量.有关更多详细信息,请参阅情节后最后一段.import numpy as ...
  • 官方示例truefalsebrigadier:double每种精度浮点参数都有自定义的最小值最大值。数轴上各处的精度不同,绝对值最大约为1.8*10308。官方示例01.2.5-1-.5-1234.56命令语法输出中的JSON属性pr...
  • 给定一个整数数组,找出两个不重叠子...思路:两个指针,经过前面题求解,这道题思路是,分别从左右遍历数组,求出其left_max[],和right_min[],然后相减,但有可能最大值出现在右边,最小值出现在左边,如何处理
  • 范例1-52 双向链表元素值的查询 129 ∷相关函数:GetElemP函数 1.3.22 稀疏矩阵的建立 136 范例1-53 稀疏矩阵的建立 136 ∷相关函数:Create函数 1.3.23 稀疏矩阵的删除 138 范例1-54 稀疏矩阵的删除 138 ∷...
  • 4·3 二次函数的最大值最小值(2) 5.分式函数、无理函数图象 5·1 分式函数图象 5·2 图象合成 5·3 分式函数的最大值最小值 5·4 无理函数图象 5·5 无理函数的最大值最小值 第四章 指数与对数 1.对数...
  • 4·3 二次函数的最大值最小值(2) 5.分式函数、无理函数图象 5·1 分式函数图象 5·2 图象合成 5·3 分式函数的最大值最小值 5·4 无理函数图象 5·5 无理函数的最大值最小值 第四章 指数与对数 1.对数...
  • 9.5.2 最小值最大值 88 9.5.3 搜寻元素 89 9.5.4 区间比较 95 9.6 变动性算法 98 9.6.1 复制元素 98 9.6.2 转换和结合元素 99 9.6.3 互换元素内容 101 9.6.4 赋予新值 101 9.6.5 替换元素 103 9.7 移除性算法 ...
  • 图像增强实现

    2012-06-07 15:42:03
    NB 伪编码的最大值,即编码范围为 0~NB,缺省值 NB=16; OPT 指定了编码方式(缺省值为 'mat'),即: OPT='row' ,按行编码 OPT='col' ,按列编码 OPT='mat' ,按整个矩阵编码 ABSOL 是函数控制参数...
  • 2.1.16 SUMX2PY2——计算数组对应值的平方和之和 63 2.1.17 SERIESSUM——计算基于公式的幂级数之和 64 2.2 舍入计算 65 2.2.1 INT——返回永远小于等于原数字的最接近的整数 65 2.2.2 TRUNC——返回数字的整数...
  • 基本数据类型 数值类型: 1.常用函数: abs():计算绝对值 ...1.单引号或者引号之间数据,字符串之间拼接用 + 号 2.强制转换:str()【数字与字符串拼接可以用该函数将数字转换成字符串】 3.多行字符串:三
  • //最大的一个元素数量 for (i=0;i;i++) { j0=(object)v11[i]; if (y11.Contains(j0)) { y12[y11.IndexOf(j0)]++; } else { y11.Add(j0); y12[y11.Count-1]=1; } } xmax=y12[0]; j0=(object)y11[0]; for (i=1;i;i+...
  • max(num,um1) 返回最大值 max(1,2)=2 min(num,num1) 返回最小值 min(1,2)=1 pow(num,num1) 返回指定数字指定次幂 pow(2,2)=4 mod(num,num1) 返回余数 mod(3,2)=1 常量: PI 值:3.14159265358979323846 E 值:2....
  • 1131.绝对值表达式的最大值 1186. 删除一次得到子数组最大和 1218. 最长定差子序列 1227. 飞机座位分配概率 1261. 在受污染二叉树中查找元素 1262. 可被三整除最大和 1297. 子串最大出现次数 1310. 子数组...
  • C语言通用范例开发金典.part2.rar

    热门讨论 2012-08-31 14:18:18
    范例1-52 双向链表元素值的查询 129 ∷相关函数:GetElemP函数 1.3.22 稀疏矩阵的建立 136 范例1-53 稀疏矩阵的建立 136 ∷相关函数:Create函数 1.3.23 稀疏矩阵的删除 138 范例1-54 稀疏矩阵的删除 138 ∷...
  • C 开发金典

    2013-06-20 16:20:03
    范例1-52 双向链表元素值的查询 129 ∷相关函数:GetElemP函数 1.3.22 稀疏矩阵的建立 136 范例1-53 稀疏矩阵的建立 136 ∷相关函数:Create函数 1.3.23 稀疏矩阵的删除 138 范例1-54 稀疏矩阵的删除 138 ∷...
  • 对于连续子数组,可以用一个数值来存储当前和,如果当前和小于零,那么在进行到下一个元素时候,直接把当前和赋值为下一个元素,如果当前和大于零,则累加下一个元素,同时用一个maxNum存储最大值并随时更新。...
  • 范例1-52 双向链表元素值的查询 129 ∷相关函数:GetElemP函数 1.3.22 稀疏矩阵的建立 136 范例1-53 稀疏矩阵的建立 136 ∷相关函数:Create函数 1.3.23 稀疏矩阵的删除 138 范例1-54 稀疏矩阵的删除 138 ∷...
  • 2009达内SQL学习笔记

    2010-02-10 19:46:58
    4、字段拼接,可用竖线(竖线只能用于select语句里)。不同DBMS可能使用不同操作符;拼接字段同样可以起别名。 如:Select first_name ||' '|| last_name || ', '|| title "Employees" From s_emp; 排他...
  • 实例066 使用指针查找数列中最大值最小值 83 实例067 用指针数组构造字符串数组 84 实例068 将若干字符串按照字母顺序输出 85 2.3 指针与函数 86 实例069 用指向函数指针比较大小 86 实例070 使用...
  • C++标准程序库.pdf

    热门讨论 2012-10-24 10:26:06
    9.5.2 求最大值最小值339 9.5.3 搜寻元素341 9.5.4 区间比较356 9.6 变动性算法(modifying algorithms) 363 9.6.1 复制(copying)元素363 9.6.2 转换(transforming)和结合(combining)元素366 9.6.3 互换...
  • 9.5.2 求最大值最小值339 9.5.3 搜寻元素341 9.5.4 区间比较356 9.6 变动性算法(modifying algorithms) 363 9.6.1 复制(copying)元素363 9.6.2 转换(transforming)和结合(combining)元素366 9.6.3...
  •  删除环境变量中PATHT CLASSPATH中包含Oracle的值。  删除“开始”/“程序”中所有Oracle组和图标。  删除所有与Oracle相关目录,包括: C:\Program file\Oracle目录。 ORACLE_BASE目录。 C:\Documents ...
  • 世界500强面试题.pdf

    2019-11-01 14:33:26
    1.2.5. 在二元树中找出和为某一值的所有路径 .............................................. 22 1.2.6. Top K 算法详细解析---百度面试 ......................................................... 29 1.2.7. ...

空空如也

空空如也

1 2
收藏数 30
精华内容 12
关键字:

双绝对值最大值的最小值