当前位置: 首页 > news >正文

15. 三数之和(LeetCode 热题 100)

题目来源:

15. 三数之和 - 力扣(LeetCode)


题目内容:

给你一个整数数组 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 。


思路分析:

  • 与采用双指针(相反方向)进行扫描类似,不过多了一个指针变成三指针


代码实现:

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        ranges::sort(nums);
        int n = nums.size();
        vector<vector<int>> ans; // 保存结果的数组,最后要去除重复
        for (int i = 0; i < n - 2;i++) { // 这里n-2是因为,三数字之和,i后面已经有了两个数字
            int j = i + 1;
            int k = n - 1;
            int temp = nums[i];
            if (i>0&&temp == nums[i - 1]) // 对k去除重复
                continue;
            while (j < k) {
                int add = temp + nums[j] + nums[k];
                if (add > 0)
                    k--;
                else if (add < 0)
                    j++;
                else { // 三数字之和为0
                    ans.push_back({temp, nums[j], nums[k]});
                    // 再次去重 对j&&k
                    for (j++; j < k && nums[j] == nums[j - 1]; j++)
                        ;
                    for (k--; k > j && nums[k] == nums[k + 1]; k--)
                        ;
                }
            }
        }
        return ans;
    }
};

题目心得:

  1. ranges::sort(nums);  //sort排序这里要这样写

  2. for (k--; k > j && nums[k] == nums[k + 1]; k--) ;//这个方法要积累一下

  3. 体会这道题里面蕴含的《双指针排序算法》的思想。准确来说是三指针,开头的i,排在第二的j=i+1,已经由尾向头的k=n-1

相关文章:

  • PyCharm Terminal 自动切换至虚拟环境
  • Jredis和SpringDataRedis学习笔记
  • 大数据开发治理平台~DataWorks(核心功能汇总)
  • AI 编程助手 cursor的系统提示词 prompt
  • 《A++ 敏捷开发》- 20 从 AI 到最佳设计
  • 鸿蒙状态管理概述
  • python shlex
  • ROS2--动作通信
  • 代码随想录刷题day23|(字符串篇)54. 替换数字
  • 基于 LangChain 实现数据库问答机器人
  • CUDA Toolkit 历史版本 cuda安装
  • C++ Qt项目教程:WebServer网络测试工具
  • C++ Primer 构造函数再探
  • 深入HBase——数据结构与算法
  • POI pptx转图片
  • Python 库自制 Cross-correlation 算法(当采样点已经1 对 1 匹配)
  • 2025-2-19学习笔记 : this关键字,constructor结构体,class类
  • 洛谷 P2234 [HNOI2002] 营业额统计(详解)c++
  • 2025软件测试就业形势剖析:机遇与挑战交织
  • 深入探讨优先队列:原理、实现与应用
  • 巴基斯坦军方:印度导弹袭击巴首都附近空军基地
  • 商务部再回应中美经贸高层会谈:美方要拿出诚意、拿出行动
  • 上海发布大风黄警:预计未来24小时内将出现8-10级大风
  • 美联储宣布维持联邦基金利率目标区间不变
  • “80后”海南琼海市长傅晟,去向公布
  • 全军军级以上单位新任纪委书记监委主任培训班结业