LeetCode刷题笔录3Sum

来源:互联网 发布:清风纸巾怎么样知乎 编辑:程序博客网 时间:2024/06/05 20:18

Given an array S of n integers, are there elements abc 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)

做过了2 Sum,这题自然不在话下。顺序遍历一遍数组,对于每个元素num[i],用-num[i]作为目标值对剩下的元素来做2 sum即可。注意数组排序以后,对于每一个i,只需要对i后面的数组元素进行2 sum即可。

另外这里比较trick的地方就是要注意去除重复元素。


public class Solution {public List<List<Integer>> threeSum(int[] num) {List<List<Integer>> res = new ArrayList<List<Integer>>();if (num.length <= 2)return res;Arrays.sort(num);int iValue = num[0];int jValue, kValue;List<Integer> sol = new ArrayList<Integer>(3);//initialize the arraylist with three meaningless values for(int i = 0; i < 3; i++){sol.add(Integer.MIN_VALUE);}for (int i = 0; i < num.length - 2; i++) {// avoid duplicationif (i != 0 && num[i] == iValue)continue;sol.set(0, num[i]);// do two sumint j = i + 1;int k = num.length - 1;while (j < k) {jValue = num[j];kValue = num[k];int twoSum = num[j] + num[k];// found a solutionif (twoSum + sol.get(0) == 0) {sol.set(1, num[j]);sol.set(2, num[k]);res.add(new ArrayList<Integer>(sol));// increment j until num[j] is different from the current j// value to avoid duplicateswhile (++j < k && num[j] == jValue);// the same for kwhile (--k > j && num[k] == kValue);} else {if (twoSum + sol.get(0) < 0) {while (++j < k && num[j] == jValue);} else {while (--k > j && num[k] == kValue);}}}iValue = num[i];}return res;}}


0 0
原创粉丝点击