nSum 问题 发表于 2020-09-14 | 分类于 算法 | 次阅读 字数统计: 295 | 阅读时长 ≈ 2分钟 1.两数之和 15.三数之和 18.四数之和 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657/** * 100sum * 调用前 先给数组排序 Arrays.sort(nums); */ public List<List<Integer>> nSumTarget(int[] nums, int n, int start, int target) { List<List<Integer>> res = new ArrayList<>(); int sz = nums.length; //至少2sum if (n < 2 || sz < n) { return res; } //从2sum开始 if (n == 2) { //双指针 int left = start; int right = sz - 1; while (left < right) { int sum = nums[left] + nums[right]; int lv = nums[left]; int rv = nums[right]; if (sum < target) { while (left < right && nums[left] == lv) { left++; } } else if (sum > target) { while (left < right && nums[right] == rv) { right--; } } else { List<Integer> l = new ArrayList<>(); l.add(lv); l.add(rv); res.add(l); while (left < right && nums[left] == lv) { left++; } while (left < right && nums[right] == rv) { right--; } } } } else { // n > 2时 递归计算(n - 1)sum 的结果 for (int i = start; i < sz; i++) { List<List<Integer>> sub = nSumTarget(nums, n - 1, i + 1, target - nums[i]); for (List<Integer> arr : sub) { //(n - 1)sum + num[i] = nsum arr.add(nums[i]); res.add(arr); } while (i < sz - 1 && nums[i] == nums[i + 1]) { i++; } } } return res; } tips: 调用前先给数组排序 1234nsum调用int[] arr = new int[]{};Arrays.sort(arr);nSumTarget(arr, n, 0, target) 坚持原创技术分享,您的支持将鼓励我继续创作! 打赏 微信支付 本文作者: 李智 发布时间: 2020年09月14日 - 14:09 更新时间: 2021年03月18日 - 14:03 本文链接: http://justdoitlee.github.io/2020/09/14/nSum-问题/ 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!