题目
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[2,7] 或者 [7,2]
示例 2:
输入:nums = [10,26,30,31,47,60], target = 40
输出:[10,30] 或者 [30,10]
思路
相遇类型的双指针
代码
public int[] twoSum(int[] nums, int target) {
int i = 0;
int j = nums.length-1;
while(i<j){
int sum = nums[i]+nums[j];
if(sum<target){
i++;
}else if(sum>target){
j--;
}else{
return new int []{nums[i],nums[j]};
}
}
return new int[0];
}
题目描述
输出多个数字
输入:
[100,10,20,70,60,10,50],80
返回值:
[[10,10,60],[10,20,50],[10,70],[20,60]]
说明:
给定的候选数集是[100,10,20,70,60,10,50],目标数是80
import java.util.*;
public class Solution {
public ArrayList<ArrayList<Integer>> combinationSum2(int[] num, int target) {
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> arr = new ArrayList<Integer>();
if(num == null || num.length==0 || target<0)return res;
Arrays.sort(num);
dfs(num,target,res,arr,0);
return res;
}
void dfs(int[] num,int target,ArrayList<ArrayList<Integer>> res,ArrayList<Integer> arr,int start){
if(target==0){
res.add(new ArrayList<Integer>(arr));
return;
}
if(start >= num.length)return;
for(int i=start;i<num.length;i++){
if(i > start && num[i] == num[i-1])continue;
if(num[i] <= target){
arr.add(num[i]);
dfs(num,target-num[i],res,arr,i+1);
arr.remove(arr.size()-1);
}
}
return;
}
}```