【数组】532. 数组中的K-diff数对
题目:

解答:
首先将数组排序,随后从小到大遍历数组中的元素,对于每一个元素,向其右侧二分查找k+nums[i],因为向其左侧查找得到的nums[i]-k一定是在更早之前被发现的(nums[i]-k)+k。
如果当前元素和其前一个元素相等,那么其找到的结果也必然和前一个元素相等,是重复结果,因此直接跳过该元素。
采用二分查找在当前元素右侧区间查找k+nums[i]。这里采用lower_bound()函数查找第一个大于等于k+nums[i]的数,如果没找到,说明右侧最大值小于k+nums[i],此时可直接结束遍历,返回结果。如果找到,判断找到的结果是否是k+nums[i],如果是,则计数加1。
1 class Solution { 2 public: 3 int findPairs(vector<int>& nums, int k) 4 { 5 sort(nums.begin(),nums.end()); 6 7 int n=nums.size(); 8 int ans=0; 9 10 for(int i=0;i<n;++i) 11 { 12 if(i != 0 && nums[i] == nums[i-1]) 13 continue; 14 auto it=lower_bound(nums.begin()+i+1,nums.end(),k+nums[i]); 15 if(it == nums.end()) 16 { 17 //查找失败,说明此刻数组中最大值比nums[i]+k小,因此无需再进行查找 18 break; 19 } 20 if(*it == k+nums[i]) 21 { 22 ++ans; 23 } 24 } 25 return ans; 26 } 27 };

浙公网安备 33010602011771号