zoukankan      html  css  js  c++  java
  • Leetcode 3Sum

    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)

    解题思路:

    类似 Leetcode Two Sum II - Input array is sorted  O(n^2)

    The inner three while loops ensure that if there are duplicate numbers, only one of the duplicate number is added to the solution.

    Suppose the array is [2, 2, 5, 9, -7]

    When i = 0, low = 2, high = 4, the sum would be 0 and hence the solution would be added to the list. Now if we don't have these while loops and we let the for loop increment i to 1, we will once again get the same solution since 2 appears twice in the array.


    Java code

    public class Solution {
        public List<List<Integer>> threeSum(int[] nums) {
            List<List<Integer>> result = new ArrayList<List<Integer>>();
            Arrays.sort(nums);
            for(int i = 0; i < nums.length; i++){
                int low = i+1;
                int high = nums.length-1;
                while(low < high){
                    if(nums[i] + nums[low] + nums[high] == 0){
                        result.add(Arrays.asList(nums[i], nums[low], nums[high]));
                        while(i + 1 < nums.length && nums[i+1] == nums[i]) {
                            i++;
                        }
                        while(low + 1 < nums.length && nums[low+1] == nums[low]) {
                            low++;
                        }
                        while(high -1 >= 0 && nums[high] == nums[high-1]) {
                            high--;
                        }
                        low++;
                        high--;
                    }else if(nums[i]+nums[low]+nums[high]>0) {
                        high--;
                    }else {
                        low++;
                    }
                }
            }
            return result;
        }
    }

    Reference:

    1. https://leetcode.com/discuss/51713/clean-java-o-n-2-solution-using-two-pointers

  • 相关阅读:
    题解 P3071 【[USACO13JAN]座位Seating】
    [luogu]P3398 仓鼠找sugar
    快速输入输出
    Luogu P3939 数颜色
    HEOI2016/TJOI2016 排序
    POI2011 DYN-Dynamite
    USACO17JAN Promotion Counting
    AHOI2008 聚会
    Luogu P4907 A换B problem
    网络流24题 骑士共存问题
  • 原文地址:https://www.cnblogs.com/anne-vista/p/4886825.html
Copyright © 2011-2022 走看看