zoukankan      html  css  js  c++  java
  • LeetCode

    题目:

    Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.

    Note:
        Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie, a ≤ b ≤ c ≤ d)
        The solution set must not contain duplicate quadruplets.
        For example, given array S = {1 0 -1 0 -2 2}, and target = 0.
        A solution set is:
        (-1,  0, 0, 1)
        (-2, -1, 1, 2)
        (-2,  0, 0, 2)

    题目:

    延续3sum和2sum的思路,不断往下找,注意排除重复的元素。

    package sum;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    public class FourSum {
    
        public List<List<Integer>> fourSum(int[] nums, int target) {
            int len;
            List<List<Integer>> res = new ArrayList<List<Integer>>();
            if (nums == null || (len = nums.length) < 4) return res;
            Arrays.sort(nums);
            for (int i = 0; i < len; ++i) {
                List<Integer> subRes = new ArrayList<Integer>();
                subRes.add(nums[i]);
                getOtherThree(res, subRes, nums, i + 1, len, target);
                while (i + 1 < len && nums[i + 1] == nums[i]) ++i;
            }
            
            return res;
        }
        
        private void getOtherThree(List<List<Integer>> res, List<Integer> subRes, int[] nums, int start, int len, int target) {
            for (int i = start; i < len; ++i) {
                List<Integer> copySubRes = new ArrayList<Integer>(subRes);
                copySubRes.add(nums[i]);
                getOtherTwo(res, copySubRes, nums, i + 1, len, target);
                while (i + 1 < len && nums[i + 1] == nums[i]) ++i;
            }
        }
        
        private void getOtherTwo(List<List<Integer>> res, List<Integer> subRes, int[] nums, int start, int len, int target) {
            int sum = 0;
            for (int i : subRes) sum += i;
            int rem = target - sum;
            
            int left = start;
            int right = len - 1;
            while (left < right) {
                if (nums[left] + nums[right] == rem) {
                    List<Integer> copySubRes = new ArrayList<Integer>(subRes);
                    copySubRes.add(nums[left]);
                    copySubRes.add(nums[right]);
                    res.add(copySubRes);
                    do { ++left; } while (left < len && nums[left - 1] == nums[left]);
                    do { --right; } while (right >=0 && nums[right + 1] == nums[right]);
                } else if (nums[left] + nums[right] < rem) {
                    ++left;
                } else {
                    --right;
                }
            }
        }
        
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            int[] nums = { 0,0,4,-2,-3,-2,-2,-3 };
            FourSum f = new FourSum();
            List<List<Integer>> res = f.fourSum(nums, -1);
            for (List<Integer> l : res) {
                for (int i : l)
                    System.out.print(i + "	");
                System.out.println();
            }
        }
    
    }
  • 相关阅读:
    转:算法的空间复杂度
    转:算法的最坏情况与平均情况 复杂度就要看最坏情况
    转:一些字符串函数的实现
    转:C语言字符串操作函数
    搜狐在线笔试 时间复杂度O(n)实现数组A[n]中所有元素循环左移k个位置
    搜狐笔试 最大连续递增子段和 关键词连续递增
    转:最小区间:k个有序的数组,找到最小区间使k个数组中每个数组至少有一个数在区间中
    转:strcpy实现的考察要点
    转:strcat与strcpy与strcmp与strlen
    转:多篇文章中的设计模式-------策略模式
  • 原文地址:https://www.cnblogs.com/null00/p/5060227.html
Copyright © 2011-2022 走看看