【LeetCode-中等题】15. 三数之和

题目

题解一:双指针法

图解参考链接:画解算法:15. 三数之和

详解参考代码随想录讲的非常好
梦破碎的地方!| LeetCode:15.三数之和

代码:

java 复制代码
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {

      List<List<Integer>> ans = new ArrayList<>();//定义最后存放三元组的list集合

      if(nums.length<3||nums == null)  return ans;//若数组元素个数小于3或为空,直接返回空集合

      Arrays.sort(nums);//对数组进行排序
        //循环数组,拿出每一个元素当做a              a+b+c = 0;
      for(int i=0;i<nums.length;i++){

          if(nums[i]>0) break; // 因为是排序好的数组,如果当前数字大于0,则三数之和一定大于0,所以结束循环 

          if(i>0&&nums[i]==nums[i-1]) continue;  //给每个相同的nums元素去重,不然会有重复的三元组的

          int left = i+1;//左指针  相当于b
          int right = nums.length -1;//右指针  相当于c

          while(left<right){//为什么条件不是left<=right  ,因为如果设置等于了,
                          //那么如果在相等的情况下构成了三元组,其实right和left是同一个数,肯定不行。
            int sum = nums[i] + nums[right] + nums[left];//计算abc的值是否为0 
            if(sum>0)  right--;  //如果sum大于0代表,需要缩小sun的值,那么只能通过把大值调小,才能更加靠近0
            else if(sum<0) left++;//同理
            else if(sum == 0){//满足条件
             List<Integer> list = Arrays.asList(nums[i],nums[left],nums[right]);//将满足条件的三个元素加入到list集合中
                 ans.add(list);//把满足条件的三元组加入到最后的三元组大集合中
                 //对right  和  left的去重   -1    -1      -1      0       1      2      2         三元组 -1 -1   2
                 //                        nums  left                                  right

                //                          -1    -1      -1      0       1      2      2
                 //                         nums          left                  right             三元组 -1  -1   2
                while(left < right&&nums[left] == nums[left + 1])  left++;
                while(left < right&&nums[right] == nums[right - 1]) right--;
                left++;
                right--;
            }

         }
      }
       return ans;
    }
}
相关推荐
白羊by4 小时前
YOLOv1~v11 全版本核心演进总览
深度学习·算法·yolo
墨尘笔尖5 小时前
最大最小值降采样算法的优化
c++·算法
skylijf6 小时前
2026 高项第 6 章 预测考点 + 练习题(共 12 题,做完稳拿分)
笔记·程序人生·其他·职场和发展·软件工程·团队开发·产品经理
white-persist7 小时前
【vulhub shiro 漏洞复现】vulhub shiro CVE-2016-4437 Shiro反序列化漏洞复现详细分析解释
运维·服务器·网络·python·算法·安全·web安全
FL16238631298 小时前
基于C#winform部署软前景分割DAViD算法的onnx模型实现前景分割
开发语言·算法·c#
baizhigangqw8 小时前
启发式算法WebApp实验室:从搜索策略到群体智能的能力进阶
算法·启发式算法·web app
C雨后彩虹8 小时前
最多等和不相交连续子序列
java·数据结构·算法·华为·面试
一江寒逸9 小时前
零基础从入门到精通 AI Agent 开发(全栈保姆级教程)附加篇:AI Agent 面试八股文全集
人工智能·面试·职场和发展
久菜盒子工作室9 小时前
面试经验|产品经理|自我介绍
面试·职场和发展·产品经理
cpp_25019 小时前
P2347 [NOIP 1996 提高组] 砝码称重
数据结构·c++·算法·题解·洛谷·noip·背包dp