@XQF
2018-03-07T14:56:12.000000Z
字数 1845
阅读 1275
数据结构与算法
此类问题是XXX几个数相加等于一个定值的问题范本,。,LeetCode上这种问题很多。有些题是说明数组元素可以重复,有些是只能出现一次
先把数组排序,然后分别从前往后和从后往前两个指针遍历。
public class Test {public List<List<Integer>> findSum(int[] nums, int k) {if (nums.length == 0 || nums == null) {return null;}Arrays.sort(nums);System.out.println(Arrays.toString(nums));int left = 0;int right = nums.length - 1;List<List<Integer>> result = new ArrayList<>();while (left < right) {int temp = nums[left] + nums[right];if (temp == k) {List<Integer> item = new ArrayList<>();item.add(nums[left]);item.add(nums[right]);System.out.println("item: " + item);result.add(item);left++;} else if (temp > k) {right--;} else {left++;}}return result;}public static void main(String[] args) {int[] nums = {1, 7, 17, 2, 6, 3, 14};Test t = new Test();List<List<Integer>> result = t.findSum(nums, 20);System.out.println(result);}}
思路很清晰,。,。夹逼,。,可是这是指定两个元素,要是没有指定元素尼,。,。,没有办法夹逼了
还有点小问题,。,为什么最后结果不对为空。其他扩展版比如元素可重复,指定个数,。指定个数在计算的时候加一个conunter就是了
public class Test {public List<List<Integer>> findSum(int[] nums, int target) {if (nums.length == 0 || nums == null) {return null;}List<List<Integer>> result = new ArrayList<>();List<Integer> item = new ArrayList<>();Arrays.sort(nums);System.out.println(Arrays.toString(nums));dfs(0, nums, target, item, result);return result;}public void dfs(int left, int[] nums, int target, List<Integer> item, List<List<Integer>> result) {if (target < 0) {return;}if (target == 0) {System.out.println("item:" + item);result.add(item);System.out.println("result" + result);return;}for (int i = left; i < nums.length; i++) {int newTarget = target - nums[i];item.add(nums[i]);dfs(i + 1, nums, newTarget, item, result);item.remove(item.size() - 1);}}public static void main(String[] args) {int[] nums = {1, 7};Test t = new Test();List<List<Integer>> result = t.findSum(nums, 8);System.out.println(result);}}
