关于取出有序数组内三个不重复的数字 通用解法

因为要取出三个不同的数字,所以要记得去重,一般情况下遇到去重就可以去想想对数组排序

这里题目已经说了数组是有序的,所以开始去思考如何解决。

首先暴力肯定不行,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个,感觉思想应该没问题,先记录一下。
其实以后遇到有序数组内两个数字之类的也可以这样子处理,只不过是把这个等差数列求和给变换成直接加上子数组长度。

posted @ 2022-03-10 17:43  mirage_mc  阅读(338)  评论(0编辑  收藏  举报