Day56| 灵神 | 相向双指针:统计和小于目标的下标对数目&&最接近的三数之和
2824.统计和小于目标的下标对数目
2824. 统计和小于目标的下标对数目 - 力扣(LeetCode)
思路:
和两数之和思路一样
大了就r–
小了就收集答案
完整代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class Solution { public: int countPairs(vector<int>& nums, int target) { sort(nums.begin(),nums.end()); int res=0; int l=0,r=nums.size()-1; while(l<r) { if(nums[l]+nums[r]>=target) r--; else { res+=(r-l); l++; } } return res; } };
|
记录一下自己写的,上面的版本是灵神的答案,把我的优化了,其实就是没想到l在取过答案以后,r就不可能从最后开始了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class Solution { public: int countPairs(vector<int>& nums, int target) { sort(nums.begin(),nums.end()); int res=0; for(int i=0;i<nums.size()-1;i++) { int l=i,r=nums.size()-1; while(l<r) { if(nums[l]+nums[r]>=target) r--; else { res+=(r-l); break; } } } return res; } };
|
16.最接近的三数之和
16. 最接近的三数之和 - 力扣(LeetCode)
思路:
和三数之和思路类似,甚至不需要去重,所以更加简单。
只需要增加一个变量x来记录三个数的和与target之间的最小差值就是了
只要target和三数之和的差值小于x,那就更新x和最后返回的答案
完整代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| class Solution { public: int threeSumClosest(vector<int>& nums, int target) { sort(nums.begin(),nums.end()); int res=0; int minTemp=INT_MAX; for(int i=0;i<nums.size()-2;i++) { int l=i+1,r=nums.size()-1; while(l<r) { int cur=nums[i]+nums[r]+nums[l]; if(cur>target) { if(cur-target<minTemp) { minTemp=cur-target; res=cur; } r--; } else if(cur<target) { if(target-cur<minTemp) { minTemp=target-cur; res=cur; } l++; } else return cur; } } return res; } };
|