核心:
将多个循环嵌套合并到一个循环中,以此优化算法。
for(int i){ for(int j){ } } 变为 for(int i,j){ }
2.2.1 反向扫描
求指定和的整数对:给你一串数字1、2、3、2、5,求其中加起来等于5的有几对。
1.排序 sort(a,a+n); 2.
int goal=5; int res=0;
for(int i=0,j=5-1;i<j;){
sum=a[i]+a[j];
if(sum>goal) j--;
if(sum<goal) i++;
if(sum==goal) res++;
i++
}
printf("%d",res);
while(n--)
2.2.2 同向扫描
给你一串数字,1、2、3、2、5,求有多少个区间加起来等于5;
1.不用排序。 2.
int sum=0; int goal=5; sum=a[0]
for(int i=0,j=0;j<length;){
if(sum==goal){ printf("%d %d",i,j}; sum-=a[i]; i--;}
if(sum<goal) { j++; sum+=a[j]; }
if(sum>goal) { i++; sum-=a[i]; }
if(j<i) { j++; }
}
数组去重
数组:1 1 1 3 5 5
1.int i=0,j=0;
2.while(i<=length) {
i++;
if(a[i]!=a[j]){
j++; a[j]=a[i];
}
}
不重复的新数组:0~j;