k数之和

2019-08-02  本文已影响0人  今天不想掉头发

求解k数之和,必须要保证数组有序,方便后面跳过重复的数字,当k是2的时候,退化为求解2数之和

public static ArrayList<List<Integer>> kSum(int nums[], int target, int k, int start) {
        // 必须要保证数组有序
        Arrays.sort(nums);
        ArrayList<List<Integer>> res = new ArrayList<List<Integer>>();
        if (start >= nums.length)
            return res;
        if (k == 2) {
            int l = start, h = nums.length - 1;
            while (l < h) {
                if (nums[l] + nums[h] == target) {
                    List<Integer> list = new ArrayList<>();
                    list.add(nums[l]);
                    list.add(nums[h]);
                    res.add(list);
                    while (l < h && nums[l] == nums[l + 1])
                        l++;
                    while (l < h && nums[h] == nums[h - 1])
                        h--;
                    l++;
                    h--;
                } else if (nums[l] + nums[h] < target)
                    l++;
                else
                    h--;
            }
            return res;
        }
        if (k > 2) {
            for (int i = start; i < nums.length - k + 1; i++) {
                // 求k-1数之和为target-nums[i]
                ArrayList<List<Integer>> temp = kSum(nums, target - nums[i], k - 1, i + 1);
                // 对于得到的k-1数之和为target-nums[i]的所有集合,都添加上nums[i]就得到了k数之和为target的集合
                if (temp != null) {
                    for (List<Integer> l : temp) {
                        l.add(0, nums[i]);
                    }
                    res.addAll(temp);
                }
                // 为了跳过那些重复的数据
                while (i < nums.length - 1 && nums[i] == nums[i + 1]) {
                    i++;
                }
            }
            return res;
        }
        return res;
    }
上一篇 下一篇

猜你喜欢

热点阅读