• LeetCode 15. 三数之和


    三数之和

    题目链接 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] 。
    注意,输出的顺序和三元组的顺序并不重要。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    示例 2:

    输入:nums = [0,1,1]
    输出:[]
    解释:唯一可能的三元组和不为 0 。
    
    • 1
    • 2
    • 3

    示例 3:

    输入:nums = [0,0,0]
    输出:[[0,0,0]]
    解释:唯一可能的三元组和为 0 。
    
    • 1
    • 2
    • 3

    题目解释

    在数组中找到三个元素,然后让他们的和为0,注意的是我们结果不要重复.

    算法原理

    这个很简单,我们先排序.然后固定一个元素val,在这个前面寻找两个元素,求他们的和为-val.这不就退化成我们的两个元素之和了吗.这里我们需要解决两个问题

    • 为何当val为最大值的时候,我们在前面选两个数一定是所有情况,这是对于每一个结果而言,我们的三个元素中一定存在一个值比较大(都为0的也是符合下面的), 我们将数组中的每一个元素都作为一个最大值,让后遍历整个数组,就可以收取所有情况
    • 如何解决重复问题,这里提供两个方法,一个是都保存下来,等到最后处理,麻烦.第二个是在收集结果的时候就处理了

    细节补充

    补充下细节,我们如何处理.

    • 固定下最大值val, 收集结果之后跳过重复的val
    • 对于收集的一次结果,跳过重复的num[left]和num[right]

    代码编写

    class Solution
    {
    public:
    
      vector> threeSum(vector &nums)
      {
        vector> reuslt;
        sort(nums.begin(), nums.end());
    
        for (int i = nums.size() - 1; i >= 2;)
        {
          int val = nums[i];
          int left = 0;
          int right = i - 1;
          while (left < right)
          {
            int sum = nums[left] + nums[right];
            if (sum + val == 0)
            {
              // 收集
              reuslt.push_back({nums[left], nums[right], val});
              // 跟新
              left++;
              right--;
              while (left < right && nums[left] == nums[left - 1])
                left++;
              while (left < right && nums[right] == nums[right + 1])
                right--;
            }
            else if (sum > -val)
            {
              right--;
            }
            else
            {
              left++;
            }
          }
    
          while (i >= 2 && nums[i] == val)
          {
            i--;
          }
        }
        return reuslt;
      }
    };
    
    • 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
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
  • 相关阅读:
    Java中类成员访问权限修饰符(public、protected、default、private)
    vue3中实现监听dom
    分布式事务
    【SVM分类】基于matlab粒子群算法优化SVM分类【含Matlab源码 1859期】
    【ML】Q-Learning应用于具有连续状态的问题(Q-Learning 学习滑冰)
    【计算机网络】运输层习题(谢希仁)(3)
    《PyTorch 2.0深度学习从零开始学》已出版
    Python基础知识整理 01-变量、数据类型、运算符、判断语句、循环语句
    IRIS的镜像配置(1)
    Selenium自动化测试之Selenium IDE
  • 原文地址:https://blog.csdn.net/m0_61334618/article/details/133999462