杭州优质网站建设,ai效果图制作教程,餐饮vi设计一套多少钱,无代码网站开发平台这道题的思路是排序双指针。 对于排好序的数组#xff0c;存在以下几种情况#xff1a;
当元素i为正数时#xff0c;其之后的数字不在存在三数之和等于0的情况了。当元素i为负数或0时#xff0c;为了避免重复#xff0c;依次从头遍历数组#xff0c;检查当前元素i之后的…这道题的思路是排序双指针。 对于排好序的数组存在以下几种情况
当元素i为正数时其之后的数字不在存在三数之和等于0的情况了。当元素i为负数或0时为了避免重复依次从头遍历数组检查当前元素i之后的区间里是否存在nums[i] nums[L] nums[R]的情况其中L从i1开始向右遍历R从n-1开始向左遍历。其中若nums[i] nums[L] nums[R] 0则保存答案遍历L和R继续找包含元素i的三数之和若小于0则表示左边界过小L若大于0则表示右边界过大R--。在遍历i、L和R的时候要注意避开重复数字。考虑边界情况当nums.size()小于3时直接返回空数组{}。
class Solution {
public:vectorvectorint threeSum(vectorint nums) {vectorvectorint ans;sort(nums.begin(), nums.end());int n nums.size();if (n 3) return {};for (int i 0; i n; i) {if (nums[i] 0) break;if (i 0 nums[i] nums[i - 1]) continue;int L i 1, R n - 1;while (L R) {if (nums[i] nums[L] nums[R] 0) {ans.push_back({nums[i], nums[L], nums[R]});while (L R nums[L] nums[L 1]) L;while (L R nums[R] nums[R - 1]) --R;L;--R;} else if (nums[i] nums[L] nums[R] 0) {L;} else {--R;}}}return ans;}
};链接以前同一道题的博客记录