給定乙個候選數字的集合 candidates 和乙個目標值 target. 找到 candidates 中所有的和為 target 的組合。
在同乙個組合中, candidates 中的某個數字不限次數地出現。
輸入: candidates = [2, 3, 6, 7], target = 7
輸出: [[7], [2, 2, 3]]
輸入: candidates = [1], target = 3
輸出: [[1, 1, 1]]
1.由於題目候選數字的集合candidates可能包含重複數字,且返回的結果要求組合內數字非降序,因此首先需對candidates進行公升序排序並去重,得到新的數字集合candidatesnew;
2.對新的數字集合進行深度優先搜尋,傳入的引數包括:數字集合candidatesnew、當前的位置index、當前存入的組合current、距離目標值的差remaintarget、儲存答案的列表result;
時間複雜度:o(n^target/min), (拷貝過程視作o(1)),n為集合中數字個數,min為集合中最小的數字
每個位置可以取集合中的任意數字,最多有target/min個數字。
空間複雜度:o(n^target /min),n為集合中數字個數,min為集合中最 小的數字
對於用來儲存答案的列表,最多有n^target/min種組合
public class solution
// 排序和去重
int candidatesnew = removeduplicates(candidates);
// dfs
dfs(candidatesnew, 0, new arraylist(), target, results);
return results;
}private int removeduplicates(int candidates)
}int candidatesnew = new int[index + 1];
for (int i = 0; i < index + 1; i++)
return candidatesnew;
}private void dfs(int candidatesnew, int index, listcurrent, int remaintarget, list> results)
// 遞迴的拆解:挑乙個數放入current
for (int i = index; i < candidatesnew.length; i++)
current.add(candidatesnew[i]);
dfs(candidatesnew, i, current, remaintarget - candidatesnew[i], results);
current.remove(current.size() - 1);}}
}
簡單面試題
1.short s1 1 s1 s1 1 有錯嗎?short s1 1 s1 1 有錯嗎?答 對於short s1 1 s1 s1 1 由於1是int型別,因此s1 1運算結果也是int 型,需要強制轉換型別才能賦值給short型。而short s1 1 s1 1 可以正確編譯,因為s1 1 相當於...
面試題 找單獨數字
陣列a中,除了某乙個數字x之外,其他數字都出現了 三次,而x出現了 一次。請給出最快的方法,找到x。這道題是 陣列中除了乙個數字外,其他數字都出現了兩次這道題的公升級版,在其他數字都是兩個的陣列中找出單獨的數字,由於兩個相同的數字經過異或運算後為0,所以我們只要讓陣列中的每乙個數字相互異或就能找到那...
Python 數字聯盟 面試題
1.寫出輸出結果 class myclass class name xiaobai def init self,args if args self.class name args 0 def print name self print this class name format self.clas...