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)
[分析] Two Sum的扩展版,排序输入数组,遍历数组求解。遍历 nums[k]时,找出下标 k 后面所有加和为 -nums[k]的pair,因为数组已排序,可使用两指针从两端往中间夹逼的技巧求解 two sum。注意到 k 只需遍历到相应数组元素为0时即可停止,因为三个正数的和不可能是0,另外遍历时需要跳过重复元素。
public class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
if (nums == null || nums.length < 3)
return result;
Arrays.sort(nums);
int N = nums.length;
for (int k = 0; k < N - 2 && nums[k] <= 0; k++) {
if (k > 0 && nums[k] == nums[k - 1])
continue;
int i = k + 1, j = N - 1;
while ( i < j) {
int sum2 = nums[i] + nums[j];
if (sum2 == -nums[k]) {
List<Integer> item = new ArrayList<Integer>();
item.add(nums[k]);
item.add(nums[i]);
item.add(nums[j]);
result.add(item);
while (++i < j && nums[i] == nums[i - 1]);
while (i <--j && nums[j] == nums[j + 1]);
} else if (sum2 < -nums[k]) {
while (++i < j && nums[i] == nums[i - 1]);
} else {
while (i <--j && nums[j] == nums[j + 1]);
}
}
}
return result;
}
}
分享到:
相关推荐
java java_leetcode-112-path-sum
java java_leetcode-113-path-sumII
001.two-sum │ ├── information.json │ ├── README.md ├── 002.add-two-numbers │ ├── information.json │ ├── README.md ... 有一些有用的选项: Options: -r, --rule crawling rule, ...
《算法——LeetCode解决方案解析》 在编程领域,算法扮演着至关重要的角色,它是程序员的智慧结晶,是解决复杂问题的高效工具。本资源“Algorithm-LeetCode-Solution-From-GuaZiDou.zip”正是围绕这个核心主题展开...
3 ] } , ] , } npm start 特征 忽视问题 如果导出ignore: true则可以忽略问题 测试无序结果 如果要求您提供一系列没有特定顺序的解决方案,您可以使用辅助方法来测试您的功能。 参见49.group-anagrams.js
离线和leetcode leetcode-cli 一个享受 leetcode 的高效 cli 工具! 非常感谢 leetcode.com,一个非常棒的网站!...⦙⦙⦙⦙⦙⦙⦙⦙ ...'[3,2,4]\n7' Submit final solution! $ leetcode submit ./two-sum.cpp
离线和leetcode leetcode-cli 一个享受 leetcode 的高效 cli 工具! 非常感谢 leetcode.com,一个非常棒的网站!...⦙⦙⦙⦙⦙⦙⦙⦙ ...'[3,2,4]\n7' Submit final solution! $ leetcode submit ./two-sum.cpp
leetcode 答案 leetcode-machine-swift :SOS_button: 请帮助在Sources/leetcode-machine-swift/leetcode.swift设置所有 leetcode 问题。 :SOS_button: 在 ...利用自动补全、类型检查......Sum " , inputs : [([ 2 , 7
https://leetcode-cn.com/problems/two-sum/ 难度 : 简单 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。...
LeetCode -- Path Sum III分析及实现方法 Path Sum III是LeetCode中的一个经典问题,旨在计算给定二叉树中所有路径的和等于某个给定值的路径数量。下面我们将详细介绍Path Sum III的分析及实现方法。 一、问题描述...
3sum leetcode-练习 算法实践 15. 3和 给定一个由 n 个整数组成的数组 nums,nums 中是否有元素 a、b、c 使得 a + b + c = 0? 在数组中找到所有唯一的三元组,其总和为零。 示例输入: [-1, 0, 1, 2, -1, -4] 示例...
c语言入门 C语言_leetcode题解之15-3sum.c
- 实现思路:类似3Sum,先排序,再通过两层循环固定两个数,使用双指针法查找另外两个数。 - **2.1.11 Remove Element** - 移除数组中所有指定的元素。 - 实现思路:使用双指针,一个指针遍历数组,另一个指针...
js js_leetcode题解之16-3sum-closest.js
js js_leetcode题解之15-3sum.js
1. "001_two_sum":这是LeetCode的第一道题目,名为“两数之和”。该问题要求在给定整数数组中找到两个元素,使得它们的和等于一个特定的目标值。你需要返回这两个元素的索引。这是一个基础的哈希表应用,通过遍历...
leetcode 2 leetcode-训练 算法训练。 java $: javac hello.java java ...leetcode ...leetcode ...leetcode ...leetcode ...leetcode ...leetcode ...leetcode ...leetcode ...leetcode ...leetcode ...1.two-sum.cpp ...'[1,2,3]\n3'
- 3Sum / 3Sum Closest / 4Sum: 这些题目都涉及到在数组中寻找具有特定和的数字组合,这通常需要用到双指针技术。 - Remove Nth Node From End of List: 给定一个链表,删除链表中的第n个节点。 - Valid Parentheses...
leetcode 只专注于解决方案! leetcode-helper是一个单 jar 库,它使您无需为每个问题设置解决方案测试脚手架。 生成解决方案/测试框架,编译,通过一行命令进行测试。 集成了Junit ...two_sum/ │ └──
例如,"Two Sum"问题要求你在数组中找到两个数,使得它们的和等于一个特定的目标值,这涉及到哈希表的使用来实现快速查找。"Merge Intervals"则要求合并重叠的区间,考察了排序和区间操作技巧。 2. **算法**:题目...