1. 程式人生 > >尋找陣列中和為指定數字的子陣列,可以重複,Leetcode 39

尋找陣列中和為指定數字的子陣列,可以重複,Leetcode 39

// 題目:給一個沒有重複元素的陣列和一個target,輸出所有和為target的元素組合,可以重複
// 解法:使用遞迴,當等於target時就將元素的組合存到List<List<Integer>> result中
public class Main {

	public static void main(String[] args){
		List<List<Integer>> result = findNum(new int[]{1,3,5,6},8);
		System.out.println("complete!");
	}
	
	public static List<List<Integer>> findNum(int[] input, int target){
		List<List<Integer>> result = new ArrayList<List<Integer>>();
		List<Integer> temp = new ArrayList<Integer>();
		findNumHelper(input,0,temp,result,target);
		return result;
	}
	
	public static void findNumHelper(int[] input, int pos, List<Integer> temp, List<List<Integer>> result, int target){

		for(int i = pos;i<input.length;i++){									//設定pos的意義在於下一個數字從當前數字及之後開始查詢,這樣可以避免重複結果的出現
			if(target == input[i]){												//如[1,1,3],[1,3,1],因為找了3之後,就不會找3前面的數字了
				temp.add(input[i]);
				result.add(new ArrayList<Integer>(temp));
				temp.remove(temp.size()-1);
				return;
			}else if(target>input[i]){
				temp.add(input[i]);
				findNumHelper(input,i,temp,result,target-input[i]);
				temp.remove(temp.size()-1);
			}else{
				return;
			}
		}
	}
	
}