【leetcode刷题笔记】3Sum
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note:
- Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
- The solution set must not contain duplicate triplets.
For example, given array S = {-1 0 1 2 -1 -4}, A solution set is: (-1, 0, 1) (-1, -1, 2)
题解:把3Sum转换成2Sum,然后解决2Sum问题。
对于num中任意一个数num[i],我们要在i+1~num.length-1之间寻找两个数使得它们的和为0-num[i]。
而寻找两个数使得它们的和为0-num[i],我们可以设定两个指针start和last,我们知道在start+1~last之间我们要寻找的数是0-num[i]-num[start],这样三个数的和就是0了。所以如果
- last所指向的数比0-num[i]-num[start]大,我们把last指针往前移动;
- 如果比0-num[i]-num[start]小,我们把start指针往后移动(last指针不动是因为我们已经搜索过了可能和last指针后面组成答案的数,这些数在start之前);
- 如果相等,就把num[i],num[start]和num[last]三个数依次放在list中作为一组答案。然后越过start后面和start相等的数,继续循环。
图示如下:
例如题目的数组排序后得到{-4,-1,0,1,2},当i指向-1的时候,我们需要在{0,1,2}之中找到两个数和为0-(-1)=1,把start指向0,last指向2,那么我们接下来要利用last找到1,last目前指向2,比需要的数1大,所以前移last,wala,我们找到了需要的1,同时找到了一组答案[-1,0,1]。
去重的工作十分简单,除了上述说的越过start后面和start相等的数外,在最外层的for循环的时候,如果num[i] = num[i-1],那么也可以越过i。
最后代码如下:
1 public class Solution { 2 public List<List<Integer>> threeSum(int[] num) { 3 List<List<Integer>> answer = new ArrayList<List<Integer>>(); 4 if(num == null || num.length == 0) 5 return answer; 6 Arrays.sort(num); 7 8 for(int i = 0;i < num.length;i++){ 9 //remove duplicates 10 if(i != 0 && num[i] == num[i-1]) 11 continue; 12 int twoSum = 0 - num[i]; 13 int start = i + 1; 14 int last = num.length-1; 15 while(start < last){ 16 int OneSum = twoSum - num[start]; 17 //Found one solution 18 if(num[last] == OneSum){ 19 ArrayList<Integer> result = new ArrayList<Integer>(); 20 result.add(num[i]); 21 result.add(num[start]); 22 result.add(num[last]); 23 answer.add(result); 24 start++; 25 last--; 26 //remove duplicates 27 while(start < last && num[start] == num[start-1]) 28 start++; 29 } 30 else if(num[last] > OneSum) 31 { 32 last--; 33 } 34 else{ 35 start++; 36 } 37 } 38 } 39 40 return answer; 41 } 42 }
分类:
leetcode刷题总结
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了