【数组】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 };

 

posted @ 2020-05-04 17:37  梦醒潇湘  阅读(174)  评论(0)    收藏  举报