关于取出有序数组内三个不重复的数字 通用解法
因为要取出三个不同的数字,所以要记得去重,一般情况下遇到去重就可以去想想对数组排序
这里题目已经说了数组是有序的,所以开始去思考如何解决。
首先暴力肯定不行,O(n^3)肯定会超时,所以根据这个有序可以思考一下在for循环里面使用一个二分查找
这个二分查找是用来查找符合条件三元组最右侧元素的位置
一旦最右侧的位置能够确定了,那么本次for循环得到的数组个数就是一个等差数列求和的问题
public int process(int[]arr,int D){
int length=arr.length;
if (length<3)return 0;
int count=0;
for (int i=0;i<length-2;i++){
int right=arr.length-1;
int left=i+1;
//此处使用二分查找,找到符合条件的最右侧数字target
int flag=0;
int target=arr[i]+D;
int mid=0;
while (left<=right){
mid=(left+right)/2;
if (arr[mid]<target){
left=mid+1;
}else if(arr[mid]>target){
right=mid-1;
}else {
flag=1;//标记查找成功
break;
}
}
//这里分查找成功和查找失败两种情况--等差数列求和
if (flag==1){
count+=(mid-i-1)*(mid-i)/2;
}else {
count+=(left-i-2)*(left-i-1)/2;
}
count%=99997867;
}
return count;
}
用例过了8/10个,感觉思想应该没问题,先记录一下。
其实以后遇到有序数组内两个数字之类的也可以这样子处理,只不过是把这个等差数列求和给变换成直接加上子数组长度。