class Solution {
List> result = new ArrayList<>();
List list = new ArrayList<>();
public List> combine(int n, int k) {
backtracking(n,k,1);
return result;
}
public void backtracking(int n,int k,int startIndex){
if(list.size()==k){
result.add(new ArrayList(list));
return;
}
for(int i = startIndex;i+(k-list.size())<=n+1;i++){
list.add(i);
backtracking(n,k,i+1);
list.remove(list.size()-1);
}
}
}
class Solution {
private:
vector> result;
vector path;
void backtracking(int n, int k, int startIndex) {
if (path.size() == k) {
result.push_back(path);
return;
}
for (int i = startIndex; i <= n - (k - path.size()) + 1; i++) { // 优化的地方
path.push_back(i); // 处理节点
backtracking(n, k, i + 1);
path.pop_back(); // 回溯,撤销处理的节点
}
}
public:
vector> combine(int n, int k) {
backtracking(n, k, 1);
return result;
}
};
注意看这两个一个是c++实现,我们发现c++中向result中添加vector对象之后,即使改变vector也不会对result中元素产生影响。这是因为:
在C++中,当你将一个vector
对象添加到另一个vector
中时,实际上是将该vector
对象的副本添加进去。这意味着result.push_back(path)
会将path
的副本添加到result
中,而不是path
本身。因此,后续对path
的修改不会影响result
中已经添加的元素。
而在Java中,List
是一个接口,ArrayList
是它的一个实现类。当你将一个ArrayList
对象添加到另一个List
中时,实际上是将对该ArrayList
对象的引用添加进去。这意味着result.add(list)
会将对list
的引用添加到result
中,而不是list
的副本。因此,后续对list
的修改会影响result
中已经添加的元素。