這道題是NP問題的題目,時間復雜度沒辦法提高,用到的還是N-Queens中的方法:用一個循環遞歸處理子問題。實現的代碼跟Combination Sum非常類似而且更加簡練,因為不用考慮重復元素的情況,而且元素只要到了k個就可以返回一個結果。代碼如下:
public ArrayList> combine(int n, int k) { ArrayList> res = new ArrayList>(); if(n<=0 || nNP問題在LeetCode中出現的頻率很高,例如N-Queens,Sudoku Solver,Combination Sum等等。不過這類題目都是用一種方法而且也沒有辦法有時間上的提高,所以還是比較好掌握的。(), res); return res; } private void helper(int n, int k, int start, ArrayList item, ArrayList> res) { if(item.size()==k) { res.add(new ArrayList (item)); return; } for(int i=start;i<=n;i++) { item.add(i); helper(n,k,i+1,item,res); item.remove(item.size()-1); } }