
🔥近津薪荼:个人主页
🎬个人专栏:《c语言基础知识详解》《c++基础知识详解》
❄️莫问几时见天明
✨休管他人论长短
本期知识点导图

1.上期参考代码:
cpp
class Solution {
public:
int xxjshitiancai(vector<int>& nums) {
sort(nums.begin(), nums.end());//先排序~
int sum = 0, n = nums.size();
for (int i = n - 1; i >= 2; i--) {
int left = 0, right = i - 1;//每一次遍历双指针的初始位置
while (left < right) {
if (nums[left] + nums[right] > nums[i]) {
sum += right - left;
right--;
} else {
left++;
}
}
}
return sum;
}
};
放一只乌萨奇在这,有什么不懂的尽管问他~

2.题目解析

重点:
升序
要找一个二元组,他俩之和满足目标值
返回任一结果即可
3.思路讲解
3.1暴力解法:
穷举出所有组合,直到找到符合要求的组合。
循环嵌套,时间复杂度O(N^2),会超时(比较简单,就不再赘述啦,有问题的同学可以看前几期的暴力解法~)

3.2优解:
思路:
- 看到有序数组,又是找指定二元组,不难想到双指针和单调性
不难想到的,对吧

- 就题给示例:

因为升序,left之后的值都比left大,但是最小值left与此right相加都大于目标值,那么在此[left,right]区间里,剩下的值与此right相加必然大于目标值**(单调性)**,那么left向右遍历没有意义,因此我们让right--
在新的区间内再次进行如上逻辑判断,直至找到和为目标值的二元组。
今天的题非常之简单,相信有不少新手同学第一次做都能自己把它做出来。
劝敲:

4.预告
下一篇要讲解的题为
三数之和(点击跳转)
思路与本题有千丝万缕的关系,
大家可以顺着这题的思路来做一做。
明天见~
