3Sum
来自 <https://leetcode.com/problems/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)
题目解读:
给定一个长度为n的整行数组S,其中存在三个元素a,b,c,使a+b+c=0. 找出所有的unique triplets使他们的和为0.
注解:
- 三元组中的元素(a,b,c)一定是升序的。(例如,a≤b≤c)
- 结果集中不能包含重复的三元组。
例如,对于数组S = {-1 0 1 2 -1 -4},
它的结果集为:
(-1, 0, 1)
(-1, -1, 2)
解析:
解法一:
暴力破解:利用三个循环,首先用i记录第一个数组元素,再用j记录第i+1个数组元素,在用k=j+1;记录第j+1数组元素,依次找到nums[i] + nums[j] + nums[k] == 0的三元组元素。时间复杂度高O(n3)
解法二:
首先对数组进行升序排序,使用快排时间复杂度为O(nlogn). 使用两个循环,
先升序排序,然后用第一重for循环确定第一个数字。
然后在第二重循环里,第二、第三个数字分别从两端往中间扫。
如果三个数的sum等于0,得到一组解。
如果三个数的sum小于0,说明需要增大,所以第二个数往右移。
如果三个数的sum大于0,说明需要减小,所以第三个数往左移。
时间复杂度:O(n2)
来自 <http://www.cnblogs.com/ganganloveu/p/3832180.html>
解法一代码:(Time Limit Exceeded)
public static List<List<Integer>> threeSum(int[] nums) { List<List<Integer>> sumList = new ArrayList<List<Integer>>(); if (nums.length < 3) return sumList; for (int i = 0; i < nums.length; i++) { while((i < nums.length) && (nums[i]==nums[i+1])){ i++; continue; } for (int j = i + 1; j < nums.length; j++) { for (int k = j + 1; k < nums.length; k++) { if (nums[i] + nums[j] + nums[k] == 0) { List<Integer> temp = new ArrayList<Integer>(); temp.add(nums[i]); temp.add(nums[j]); temp.add(nums[k]); sumList.add(temp); } while((k < nums.length) && (nums[k]==nums[k+1])) k++; } while((j < nums.length) && (nums[j]==nums[j+1])) j++; } } return sumList; }
解法二代码:
public class Solution { public List<List<Integer>> threeSum(int[] nums) { List<List<Integer>> sumList = new ArrayList<List<Integer>>(); if(nums.length < 3) return sumList; Arrays.sort(nums); for(int i=0; i<nums.length-2; i++) { if (i == 0 || nums[i] > nums[i - 1]) { int start = i+1; int end = nums.length-1; while(start<end) { if(nums[i]+nums[start]+nums[end] == 0) { ArrayList<Integer> tempList = new ArrayList<Integer>(); tempList.add(nums[i]); tempList.add(nums[start]); tempList.add(nums[end]); sumList.add(tempList); start++; end--; //去掉重复的数据 while((start<end) && (nums[end]==nums[end+1])) end--; while((start<end) && (nums[start]==nums[start-1])) start++; } else if(nums[i]+nums[start]+nums[end] > 0) { end--; } else { start++; } } } } return sumList; } }
解法二性能
相关推荐
java java_leetcode-112-path-sum
java java_leetcode-113-path-sumII
- **2.1.8 3Sum** - 在数组中找到三个数之和等于零的所有组合。 - 实现思路:首先对数组排序,然后固定一个数,使用双指针法查找另外两个数。 - **2.1.9 3Sum Closest** - 找到三个数之和最接近给定目标值的...
- **两数之和(2 Sum)**: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。 - **数组的K个数之和(Subarray Sum K)**: 给定一个整数数组和一个整数 k,...
c语言入门 C语言_leetcode题解之15-3sum.c
js js_leetcode题解之15-3sum.js
《算法——LeetCode解决方案解析》 在编程领域,算法扮演着至关重要的角色,它是程序员的智慧结晶,是解决复杂问题的高效工具。本资源“Algorithm-LeetCode-Solution-From-GuaZiDou.zip”正是围绕这个核心主题展开...
离线和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
001.two-sum │ ├── information.json │ ├── README.md ├── 002.add-two-numbers │ ├── information.json │ ├── README.md ... 有一些有用的选项: Options: -r, --rule crawling rule, ...
leetcode-1-Two-Sum 这是我在 Github 的第一天。 我只是 AC leetcode 中的第一个问题。 从现在开始,我将使用Github在leetcode中记录我的生活。 我擅长 C++,但对 java 和 Python 不是很专业,我将使用最流行的 3 种...
vscode安装leetcode leetcode-js-tdd leetcode 勇士的简单样板 如何使用 克隆这个 repo 在你的 vscode 中安装 配置扩展以使用 repo 中的problems文件夹 使用1.two-sum.js案例导出解决方案 module . exports = { // ...
根据提供的文件信息,这份名为“leetcode-常见考题2.pdf”的文档主要包含了针对大厂面试中常见的算法面试题目的整理。这份资料涉及到了LeetCode网站上许多经典和高频出现的算法题目,这些题目覆盖了不同难度级别和...
c语言入门 c语言_leetcode题解01-two-sum.c
leetcode 答案 leetcode-machine-swift :SOS_button: 请帮助在Sources/leetcode-machine-swift/leetcode.swift设置所有 leetcode 问题。 :SOS_button: 在 ...利用自动补全、类型检查......Sum " , inputs : [([ 2 , 7
js js_leetcode题解之16-3sum-closest.js
java入门 java_leetcode题解之015_3Sum
- **Sum**:计算数组的总和。 - **Find Minimum in Rotated Sorted Array**:在一个旋转了的有序数组中找到最小值。 - **Largest Rectangle in Histogram**:在直方图中找到最大的矩形面积。 - **Maximal ...
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'
https://leetcode-cn.com/problems/two-sum/ 难度 : 简单 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。...