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

LeetCode 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 。

思路:

  • 排序+ 双指针。双指针,一个从小到大,一个从大到小。
  • 注意:数据不能重复。

代码:

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        int n = nums.length;
        //排序
        Arrays.sort(nums);
        List<List<Integer>> ansList = new ArrayList<>();
        //枚举第一个数
        for (int first = 0; first < n; first++) {
            //需要和上一次枚举的数不相同
            if ( first> 0 && nums[first] == nums[first-1]) {
                continue;
            }
            //c对应的指针初始指向数组的最右端
            int third = n -1;
            int target = -nums[first];

            //枚举第二个数
            for (int second = first+1 ; second< n; second++) {
                //需要和上一次枚举的数不相同
                if (second > first+1 && nums[second] == nums[second-1]) {
                    continue;
                }                
                //要保证 b的指针在 c的指针左侧
                //注意:第三个数是从大到小逐渐变化的
                while (second < third && nums[second]+ nums[third] > target  ) {
                    --third;
                }
                //如果指针重合,随着b后续的增加
                //就不会有满足 a+b+c =0 并且 b< c,可以退出循环.
                //注意:这里是容易遗漏的地方
                if (second == third) {
                    break;
                }
                if (nums[second] + nums[third] == target) {
                    List<Integer> list = new ArrayList<>();
                    list.add( nums[first]);
                    list.add( nums[second]);
                    list.add( nums[third]);
                    ansList.add( list);
                }

            }
        }

        return ansList;

    }
}

http://www.kler.cn/a/529524.html

相关文章:

  • 【LLM-agent】(task4)搜索引擎Agent
  • Jenkins未在第一次登录后设置用户名,第二次登录不进去怎么办?
  • TensorFlow 示例摄氏度到华氏度的转换(一)
  • 【Docker】ubuntu中 Docker的使用
  • MINIRAG: TOWARDS EXTREMELY SIMPLE RETRIEVAL-AUGMENTED GENERATION论文翻译
  • kamailio的日志配置
  • 保姆级教程:利用Ollama与Open-WebUI本地部署 DeedSeek-R1大模型
  • C++11—右值引用
  • AI技术在SEO关键词优化中的应用策略与前景展望
  • 深度解析:网站快速收录与网站安全性的关系
  • 物业管理收费系统如何提升收费效率与业主满意度的全新实践
  • Vue 入门到实战 七
  • upload labs靶场
  • 【VUE案例练习】前端vue2+element-ui,后端nodo+express实现‘‘文件上传/删除‘‘功能
  • 电介质超表面中指定涡旋的非线性生成
  • 前端js高级25.1.30
  • 基于springboot私房菜定制上门服务系统设计与实现(源码+数据库+文档)
  • 万字长文深入浅出负载均衡器
  • JavaScript 中的 CSS 与页面响应式设计
  • Spring Boot Web项目全解析:从前端请求到后端处理
  • 解锁Spring Boot 3.1 + JDK 17:分布式系统的变革力量
  • 网络工程师 (14)保护期限
  • 放假前的最后一天
  • 蓝桥杯之c++入门(四)【循环】
  • leetcode_264. 丑数 II
  • 【CS61A 2024秋】Python入门课,全过程记录P5(Week8 Inheritance开始,更新于2025/2/2)