@XQF
2018-03-07T22:56:12.000000Z
字数 1845
阅读 1150
数据结构与算法
此类问题是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);
}
}