回溯基础题
class Solution {
public:
vector<int> path;
vector<vector<int>> res;
void backtracking(int n, int k, int start_index) {
if (path.size() == k) {
res.emplace_back(path);
return;
}
for (int i = start_index; i <= n-(k - path.size()) + 1; i++) { // 剪枝 i <= n-(k - patch.size()) + 1
path.emplace_back(i);
backtracking(n, k, i + 1);
path.pop_back();
}
}
vector<vector<int>> combine(int n, int k) {
backtracking(n, k, 1);
return res;
}
};
class Solution:
def combine(self, n: int, k: int):
path = []
res = []
def backtracking(n, k, start_index):
if len(path) == k:
res.append(path[:]) # 深拷贝
return
for i in range(start_index, n - (k - len(path)) + 2):
path.append(i)
backtracking(n, k, i + 1)
path.pop()
backtracking(n, k, 1)
return res
贪心
最大移动次数:stones[0]~stones[n-2]之间的空位,或者stones[1]~stones[n-1]之间的空位
最小移动次数:
在一个大小为n的窗口内,计算最大石子数,n-cnt即为最小的移动次数
class Solution:
def numMovesStonesII(self, stones: List[int]):
stones.sort()
n = len(stones)
e1 = stones[-2] - stones[0] - n + 2
e2 = stones[-1] - stones[1] - n + 2
max_move = max(e1, e2)
if e1 == 0 or e2 == 0:
return [min(2, max_move), max_move]
max_cnt = left = 0
for right, x in enumerate(stones):
while stones[left] <= x - n:
left += 1
max_cnt = max(max_cnt, right - left + 1)
return [n - max_cnt, max_move]