首页 > 其他分享 >LeetCode-15 三数之和

LeetCode-15 三数之和

时间:2023-12-25 10:04:51浏览次数:38  
标签:15 nums 三数 sum 三元组 vector && res LeetCode


LeetCode-15 三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != kj != 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

solution

采用双指针的思想,

  1. 排序,并初始化向量res
  2. 设当前指向为i,其中j指向i的右边,k指向vector的最后一个位置,此时可以保证 nums[i]<= nums[j]<= nums[k]
  3. 当j<k时进入循环
  4. nums[i]大于0时,nums[i] + nums[j] + nums[k]>0必然存在,退出循环
  5. 若出现nums[i]=nums[i - 1],则可能导致res有重复元素,则执行continue操作,使同一个数字只计算一次
  6. sum = nums[i] + nums[j] + nums[k],若sum<0,则将j向右移动,若sum>0,则将k向左移动,若sum=0,则放入向量res中,并去除j右侧的重复元素和k左侧的重复元素
  7. 重复3-6步,直到j>=k时退出循环
#include <vector>

using namespace std;

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public:
    vector<vector<int> > threeSum(vector<int> &nums) {
        int l = nums.size();
        vector<vector<int> > res;
        sort(nums.begin(), nums.end());
        for (int i = 0; i < l - 2; ++i) {
            if (nums[i] > 0) {
                break;
            }
            if (i - 1 >= 0 && nums[i] == nums[i - 1]) {
                continue;
            }
            int j = i + 1, k = l - 1;
            while (j < k) {
                int sum = nums[i] + nums[j] + nums[k];
                if (sum < 0) {
                    while (j < k && nums[j] == nums[++j]) {
                        //j++;
                    }
                } else if (sum > 0) {
                    while (j < k && nums[k] == nums[--k]) {
                        //k--;
                    }
                } else {
                    res.push_back({nums[i], nums[j], nums[k]});
                    while (j < k && nums[j] == nums[++j]) {
                        //j++;
                    }
                    while (j < k && nums[k] == nums[--k]) {
                        //k--;
                    }
                }
            }
        }
        return res;
    }
};
//leetcode submit region end(Prohibit modification and deletion)

int main() {
    Solution solution;
    vector<int> vec = {-1, 0, 1, 2, -1, -4};
    solution.threeSum(vec);
}


标签:15,nums,三数,sum,三元组,vector,&&,res,LeetCode
From: https://blog.51cto.com/u_14189203/8963542

相关文章

  • 『LeetCode』8. 字符串转换整数 (atoi) String to Integer (atoi)
    题目描述请你来实现一个myAtoi(strings)函数,使其能将字符串转换成一个32位有符号整数(类似C/C++中的atoi函数)。函数myAtoi(strings)的算法如下:读入字符串并丢弃无用的前导空格检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。确定最终结果是负数还是正......
  • 2023-2024-1 20231415 《计算机基础与程序设计》第十三周学习总结
    这个作业属于哪个班级https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP/这二个左右要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK13作业目标《C语言程序设计》第12章并完成云班课测试作业正文https://i.cnblogs.com/posts/edit教材内......
  • 2023-2024-1 学号20231315第十三周学习总结
    学期:2023-2024-1学号:20231315《计算机基础与程序设计》第十三周学习总结作业信息这个作业属于哪个课程2023-2024-1《计算机基础与程序设计》这个作业要求在哪里2023-2024-1《计算机基础与程序设计》这个作业的目标学习《C语言程序设计》第12章作业正文http......
  • [LeetCode Hot 100] LeetCode394. 字符串解码
    题目描述思路思路:碰到数字:压入数字栈,注意多位数的情况碰到字母:直接拼接到res遇到[:将num和res分别压入栈遇到]:开始处理栈顶元素方法一:classSolution{publicStringdecodeString(Strings){intnum=0;StringBuilderres=newStringBuil......
  • 『LeetCode』7. 整数反转 Reverse Integer
    题目描述给你一个32位的有符号整数x,返回将x中的数字部分反转后的结果。如果反转后整数超过32位的有符号整数的范围[−231,231−1],就返回0。假设环境不允许存储64位整数(有符号或无符号)。示例1:输入:x=123输出:321示例2:输入:x=-123输出:-321示例3:输入:x......
  • [LeetCode Hot 100] LeetCode739. 每日温度
    题目描述思路:单调递减栈使用单调栈的模板即可。根据题意可知,该题使用的是单调递减栈。问题抽象为:找出数组中右边第一个比我大的元素。方法一:classSolution{publicint[]dailyTemperatures(int[]temperatures){//用于存放结果int[]res=new......
  • [LeetCode Hot 100] LeetCode42. 接雨水
    题目描述思路一:单调栈柱子的高度递减的时候是装不了水的,当碰到第一个比之前高的柱子才可以装水。此时计算栈顶索引能装的水:宽:i-left-1(这个left为栈顶元素pop之后的peek值)高:min(height[left],height[i])-height[top]该题维护的是一个单调递减栈方法一:对应思路......
  • [LeetCode Hot 100] LeetCode84. 柱状图中最大的矩形
    题目描述思路:枚举+优化(单调栈)先固定矩阵的高。然后向左向右找到第一个比当前元素值小的元素,确定好左右边界。对于元素2来说:向左找到第一个比当前元素值小的元素:1的右边界向右找到第一个比当前元素值小的元素:3的右边界枚举每个元素的上边界,确定往左数最远到达哪个边界......
  • 『LeetCode』6. N 字形变换 Zigzag Conversion
    题目描述将一个给定字符串s根据给定的行数numRows,以从上往下、从左到右进行Z字形排列。比如输入字符串为"PAYPALISHIRING"行数为3时,排列如下:PAHNAPLSIIGYIR之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。请你实现这......
  • 『LeetCode』5. 最长回文子串 Longest Palindromic Substring
    题目描述给你一个字符串s,找到s中最长的回文子串。如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。示例1:输入:s="babad"输出:"bab"解释:"aba"同样是符合题意的答案。示例2:输入**:s="cbbd"输出:"bb"提示:1<=s.length<=1000s仅由数字和英文字母组......