网站建设经典案例,物流信息网站建设,房地产建设项目网站,辅助wordpress 页面编辑器力扣面试150题 #xff5c; 15.三数之和 题目描述解题思路代码实现 题目描述
15.三数之和
给你一个整数数组 nums #xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k #xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回… 力扣面试150题 15.三数之和 题目描述解题思路代码实现 题目描述
15.三数之和
给你一个整数数组 nums 判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k 同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。
注意答案中不可以包含重复的三元组。
示例 1
输入nums [-1,0,1,2,-1,-4] 输出[[-1,-1,2],[-1,0,1]] 解释 nums[0] nums[1] nums[2] (-1) 0 1 0 。 nums[1] nums[2] nums[4] 0 1 (-1) 0 。 nums[0] nums[3] nums[4] (-1) 2 (-1) 0 。 不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。 注意输出的顺序和三元组的顺序并不重要。
示例 2
输入nums [0,1,1] 输出[] 解释唯一可能的三元组和不为 0 。
示例 3
输入nums [0,0,0] 输出[[0,0,0]] 解释唯一可能的三元组和为 0 。
提示
3 nums.length 3000-105 nums[i] 105
解题思路
双指针法
以这个nums数组来举例首先将数组排序然后有一层for循环i 从下标0的地方开始同时定义一个下标left 指向 i1的位置上定义下标right在数组结尾的位置上。
在数组中找到 abc 使得a b c 0我们这里相当于 a nums[i]b nums[left]c nums[right]。
如果nums[i] nums[left] nums[right] 0就说明此时三数之和大了因为数组是排序后了所以right下标就应该向左移动这样才能让三数之和小一些。
如果nums[i] nums[left] nums[right] 0说明此时三数之和小了left就向右移动才能让三数之和大一些直到left与right相遇为止。
代码实现
class Solution {
public:vectorvectorint threeSum(vectorint nums) {vectorvectorint result;sort(nums.begin(), nums.end());// a b c 0// a nums[i], b nums[j], c - (a b)for (int i 0; i nums.size(); i) {// 排序之后第一个元素大于0就不可能凑成三元组if (nums[i] 0) break;// a也就是nums[i]的去重if (i 0 nums[i] nums[i - 1]) {continue;}unordered_setint set;for (int j i 1; j nums.size(); j) {// b也就是nums[j]的去重if (j i 1 nums[j] nums[j - 1]){continue; }int c 0 - (nums[i] nums[j]);if (set.find(c) ! set.end()) {result.push_back({nums[i], nums[j], c});set.erase(c); // c也就是 - (a b)的去重} else {set.insert(nums[j]);}}}return result;}
};