K Sum 问题

原创 2018年04月15日 21:52:20

相关问题总结

K Sum ?

    //从nums数组中选择能加出 target的 k 个数字,将所有不重复的可能性返回。
    public List<List<Integer>> kSum(int[] nums, int k, int target) {
        if (k < 2 || k > nums.length) {
            return new ArrayList<>();
        }
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        Arrays.sort(nums);
        kSum(nums, k, target, 0, res, new ArrayList<Integer>());
        return res;
    }

    //从nums[begin...nums.length - 1]中任选k个数字,看能否加出target,将枚举出的可能性分别追加在path后面,然后将每一条路径添加进res
    public void kSum(int[] nums, int k, int target, int begin, List<List<Integer>> res, List<Integer> path) {
         //简单判断一下
        int max = nums[nums.length - 1];
        if (nums[begin] * k > target || max * k < target) {
            return;
        }
        if (k == 2) { // 当 k==2时,退化成 Two Sum, 相当于递归的 base case.
            int left = begin;
            int right = nums.length - 1;
            while (left < right) {
                if (nums[left] + nums[right] == target) {
                    List<Integer> newPath = new ArrayList<>(path);
                    newPath.addAll(Arrays.asList(nums[left++], nums[right--]));
                    res.add(newPath);
                    while (left < right && nums[left] == nums[left - 1]) {
                        ++left;
                    }
                    while (left < right && nums[right] == nums[right + 1]) {
                        --right;
                    }
                }else if (nums[left] + nums[right] > target) {
                    --right;
                }else {
                    ++left;
                }
            }
            return;
        }

        //枚举所有可能,然后进行dfs
        for (int i = begin; i + k - 1 < nums.length; i++) {
            if (i != begin && nums[i] == nums[i - 1]) {
                continue;
            }
            // 以下都是为了剪枝,但是呢,实际运行时间还是由用例决定的,因为判断还时耗时的,很难说好或者不好
            /*
            if (nums[i] + (k - 1) * max < target) {
                continue;
            }
            if (nums[i] * k > target) {
                break;
            }

            if (nums[i] * k == target && nums[i + k - 1] == nums[i]) {
                ArrayList<Integer> newPath = new ArrayList<>(path);
                for (int j = 0; j < k; j++) {
                    newPath.add(nums[i]);
                }
                res.add(newPath);
                return;
            }
            */
            path.add(nums[i]);
            kSum(nums, k - 1, target - nums[i], i + 1, res, path);
            //回溯!!!
            path.remove(path.size() - 1);
        }
    }
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zjxxyz123/article/details/79953890

4.8.一些杂散但值得讨论的问题

-
  • 1970年01月01日 08:00

leetcode--ksum问题--3sum

【题目】:点击打开链接 Given an array S of n integers, are there elements a, b, c in S such that a + b + c...
  • sloanqin
  • sloanqin
  • 2016-07-17 22:08:28
  • 2356

LeetCode解题报告--2Sum, 3Sum, 4Sum, K Sum求和问题总结

前言: 这几天在做LeetCode 里面有2sum, 3sum(closest), 4sum等问题, 这类问题是典型的递归思路解题,该这类问题的关键在于,在进行求和求解前,要先排序Arrays.so...
  • github_27609763
  • github_27609763
  • 2015-08-17 18:22:02
  • 1947

2sum/3sum/ksum 问题

这个是面试中碰到的一个问题,还没有时间仔细实现,在网上一篇文章,转载一下,代码稍后补上。 网址: http://www.sigmainfy.com/blog/summary-of-ksum...
  • guilanl
  • guilanl
  • 2016-04-25 16:53:50
  • 868

LeetCode总结 -- kSum篇

这篇总结主要介绍LeetCode中几道关于求kSum的题目, 主要要求是在数组中寻找k个数的和能否达到目标值。 LeetCode关于kSum的主要题目有: Two Sum3Sum3Sum Closes...
  • linhuanmars
  • linhuanmars
  • 2014-08-14 11:14:12
  • 15181

【Ksum】求和问题总结(leetcode 2Sum, 3Sum, 4Sum, K Sum)

人 sigmainfy — http://tech-wonderland.net/blog/summary-of-ksum-problems.html 前言: 做过leet...
  • brandohero
  • brandohero
  • 2014-11-14 07:04:24
  • 1277

K sum

这里有一个介绍的比较系统的Ksum文章 http://tech-wonderland.net/blog/summary-of-ksum-problems.html 前言: 做...
  • salutlu
  • salutlu
  • 2014-05-16 16:06:28
  • 4799

LeetCode 之K-Sum 问题(个人理解) 双指针大法(总结)

做过leetcode的人都知道, 里面有2sum, 3sum(closest), 4sum等问题, 这些也是面试里面经典的问题, 考察是否能够合理利用排序这个性质, 一步一步得到高效的算法. 经过总结...
  • liutianshx2012
  • liutianshx2012
  • 2015-06-17 10:29:27
  • 895

HD 1003 Max Sum (最大字段和问题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003 Problem Description Given a se...
  • eagle_or_snail
  • eagle_or_snail
  • 2016-05-01 16:13:51
  • 472

[C++]LeetCode: 71 4Sum && kSum总结

题目: Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d ...
  • cinderella_niu
  • cinderella_niu
  • 2015-01-06 10:43:37
  • 1859
收藏助手
不良信息举报
您举报文章:K Sum 问题
举报原因:
原因补充:

(最多只允许输入30个字)