美文网首页
k数之和

k数之和

作者: 今天不想掉头发 | 来源:发表于2019-08-02 22:55 被阅读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;
    }

相关文章

  • k数之和

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

  • 两数之和&三数之和&四数之和&K数之和

    今天看了一道谷歌K数之和的算法题,忽然想起来之前在力扣上做过2、3、4数之和的题,觉得很有必要来整理一下。其实2、...

  • week 2019-07-14

    四数之和 括号生成 合并K个链表

  • algrithrom

    求和问题,双指针解决 done 两数之和 三数之和 最接近三数之和 四数之和 链表反转问题 done 链表反转 链...

  • 2021-07-12leetcode刷题

    所以使用len(nums)-k,而不是-k 三数之和给你一个包含 n 个整数的数组 nums,判断 nums 中是...

  • 浅入浅出实现一个异步求和函数

    简化:两数之和 我们先来简单的实现一个异步两数之和函数 加深:多数之和 上面我们实现了两数之和,然后扩展到多数之和...

  • 两数之和(golang)

    原题:两数之和 关联:两数之和 II - 输入有序数组(golang)两数之和 IV - 输入 BST(golang)

  • 两数之和 II - 输入有序数组(golang)

    原题:两数之和 II - 输入有序数组 关联:两数之和(golang)两数之和 IV - 输入 BST(golan...

  • LeetCode 第18题:四数之和

    1、前言 2、思路 采用三数之和的思路,原本三数之和可以分解为:数组中的一个数 + 此数右边的数求两数之和,那么四...

  • leetcode top100

    1.求两数之和(数组无序) 2.求电话号码的字母组合 3.三数之和 4.两数之和(链表)

网友评论

      本文标题:k数之和

      本文链接:https://www.haomeiwen.com/subject/bnfddctx.html