leetcode532-- 數組中的K-diff數對(auto,lower_bound..)

c++版本,好惡心的題,目前還沒有找到最優解,速度比java的要慢很多

給定一個整數數組和一個整數 k, 你需要在數組裏找到不同的 k-diff 數對。這裏將 k-diff 數對定義爲一個整數對 (i, j), 其中 i 和 j 都是數組中的數字,且兩數之差的絕對值是 k.

輸入: [3, 1, 4, 1, 5], k = 2
輸出: 2
解釋: 數組中有兩個 2-diff 數對, (1, 3)(3, 5)。
儘管數組中有兩個1,但我們只應返回不同的數對的數量。
輸入: [1, 3, 1, 5, 4], k = 0
輸出: 1
解釋: 數組中只有一個 0-diff 數對,(1, 1)

一,超噁心的暴力解法
先排序,直接選定i值,根據i,進行j的遍歷,找到差值爲k的值,同時count加1,注意的點:會出現重複的數值計算,

int findPairs(vector<int>& nums, int k) {
        int len=nums.size();
        int count=0;
        sort(nums.begin(),nums.end());
        for(int i=0;i<len;i++){  
            if(i!=0&&nums[i]==nums[i-1])
                continue;    //如果出現重複的值,只計算第一次出現的,  
            for(int j=i+1;j<len;j++){
                if(abs(nums[j]-nums[i])==k){
                    count++;
                    break;//防止發生重複,如(1,3,3)k=2
                }                                     
            }
        }
        return count;
    }

二,利用排序+二分查找(雙指針的,不容易理解,且速度半斤八兩,也許是自己還沒有找到最優的吧,真是頭疼)

     int findPairs(vector<int>& nums, int k) {
        int len=nums.size();
        int count=0;
        sort(nums.begin(),nums.end());
        for(int i=0;i<len;i++){
            if(i!=0&&nums[i]==nums[i-1]){
                continue;//如果發現當前值與前一個值相等,排除重複行爲,結束本次循環,不在往下進行,重新本次for循環。
            }
            auto tmp=lower_bound(nums.begin()+i+1,nums.end(),k+nums[i]);
            if(tmp==nums.end())
                break;//如果查找失敗,說明此刻數組中最大值比nums[i]+k小,因此無需再進行查找,結束整體循環。
break;
            if(*tmp==k+nums[i]){
                count++;
            }
        }
        return count;
        }

擴展:
1,auto函數
根據變量的初始值類型,自動爲此變量選擇匹配類型。在實際應用中不建議使用,一般都會直接表示該變量類型。比如此處tmp,真心不知道如何表示該類型,是vector?麼好像不是滴,是個指針地址,感覺太菜了,。

2,lower_bound(begin,end,num):
從小到大
從數組的begin位置到end-1位置二分查找第一個大於或等於num的數字,找到返回該數字的地址,不存在則返回end。通過返回的地址減去起始地址begin,得到找到數字在數組中的下標。

**lower_bound( begin,end,num,greater() )**大–小
3,對於continue,break理解比較混亂,這次終於理解了,continue,break
4,對於一些變量的理解,

nums{1,3,4,6,8,9}
nums.begin()====> {1}  /返回指向容器最開始位置數據的指針
nums.begin()+1====> {3} /下座標加1,返回其指針
nums.end()-1====> {9} /返回指向容器最後一個數據單元+1的指針
tmp ===> i=0 k=3 時,tmp: {4},,  *tmp = 4

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章