Leet Code OJ 15. 3Sum[Difficulty: Medium]
題目:
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},
翻譯:
給定一個數(shù)組S,它包含n個整數(shù),它是否存在3個元素a,b,c,滿足a+b+c=0?找出所有滿足條件的元素數(shù)組。
提示:a,b,c三個元素必須是升序排列(也就是滿足a ≤ b ≤ c),最終的結(jié)果不能包含重復的元素數(shù)組。例如給定S為{-1 0 1 2 -1 -4},返回結(jié)果是(-1, 0, 1)和(-1, -1, 2)。
分析:
最容易想到的方法就是3重循環(huán)遍歷所有可能的元素,進行判斷是否等于0。下面的方案作了一些改進:
1. 對數(shù)組進行排序,跳過肯定會大于0的結(jié)果
2. 借助map避免第三層遍歷
3. 由于做了排序,所以可以較為容易的跳過重復的結(jié)果
代碼(Java版):
public class Solution {public List <List<Integer>> threeSum(int[] nums) {List<List<Integer>> res = new ArrayList<>();//nums先進行排序Arrays.sort(nums);Map<Integer, List<Integer>> map = new HashMap<>();for (int i = 0; i < nums.length; i++) {int num = nums[i];if (map.get(num) == null) {List<Integer> subscripts = new ArrayList<>();subscripts.add(i);map.put(num, subscripts);} else {map.get(num).add(i);}}for (int i = 0; i <= nums.length - 3; i++) {if (nums[i] > 0) {break;}if (i > 0 && nums[i] == nums[i - 1]) {continue;}for (int j = i + 1; j <= nums.length - 2; j++) {if (j > i + 1 && nums[j] == nums[j - 1]) {continue;}int finalNum = -nums[i] - nums[j];if (finalNum < nums[j]) {break;}List<Integer> subscripts = map.get(finalNum);if (subscripts == null) {continue;}for (Integer subscript : subscripts) {if (subscript != j && subscript != i) {List<Integer> list = new ArrayList<>();list.add(nums[i]);list.add(nums[j]);list.add(nums[subscript]);res.add(list);break;}}}}return res;} }總結(jié)
以上是生活随笔為你收集整理的Leet Code OJ 15. 3Sum[Difficulty: Medium]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS下Hive2.0.0单机模式
- 下一篇: 关于$'\r': command not