Java算法学习之回溯算法(一)

力扣第77号问题

给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。

示例:

输入: n = 4, k = 2
输出:
[
  [2,4],
  [3,4],
  [2,3],
  [1,2],
  [1,3],
  [1,4],
]

回溯法:
是一种通过遍历所有可能成员来寻找全部可行解的算法。若候选 不是 可行解 (或者至少不是 最后一个 解),回溯法会在前一步进行一些修改以舍弃该候选,换而言之, 回溯并再次尝试。

class Solution {
    public List> combine(int n, int k) {
        List res = new ArrayList();
        List tmp = new ArrayList<>();
        if(n(tmp));
            return;
        }
        for(int j = start; j <= n; j++){//回溯法核心
                tmp.add(j);//将j添加进tmp中
                select(k, n,j+1, tmp, res );//进行下一级判断
                tmp.remove(tmp.size()-1);//判断结束,去除刚才加进去的j,继续循环
            
        }
    }
}

注意:

1.List 参数在传递时是属于地址传递。

2.tmp达至k后,在添加进res中时,一定要new 出来一个新的List,为的是,后面对tmp操作,不影响res中已存的值。

你可能感兴趣的:(Java成长之路)