Leetcode 15. 三数之和
难度
题目
https://leetcode-cn.com/problems/3sum/
思路
双指针
本题最关键的是如何去除重复解。
首先,如果数组长度小于3,返回空
按从小到大顺序排序数组。
如果长度大于等于3
在遍历数组的过程中维护一个left和right
left = i + 1, right = nums.length
如果num[i] > 0,也即是后面都是大于0的,返回结果。
其次,如果nums[i]与nums[i - 1]相等,也就是nums[i]这个值之前已经判断过,continue。
如果发现了nums[i] + nums[left] + nums[right] == 0,将其加入结果中。并通过下面步骤去重。
如果nums[left] == nums[left + 1],结果重复,left += 1
right类似。
solution
class Solution { public List<List<Integer>> threeSum(int[] nums) { Arrays.sort(nums); List<List<Integer>> res = new ArrayList<>(); if (nums.length < 3) { return res; } for (int i = 0; i < nums.length; i++) { if (nums[i] > 0) return res; if (i > 0 && nums[i] == nums[i - 1]) continue; //第一个为nums[i]的值已经判断过 int left = i + 1; int right = nums.length - 1; while (left < right) { if (nums[i] + nums[left] + nums[right] == 0) { res.add(Arrays.asList(nums[i], nums[left], nums[right])); while (left < right && nums[left] == nums[left + 1]) left += 1; while (left < right && nums[right] == nums[right - 1]) right -= 1; left += 1; right -= 1; } else if (nums[i] + nums[left] + nums[right] > 0) right -= 1; else left += 1; } } return res; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix