给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。
示例:
这题初看想用子集的方法来做,但是发现存在一个问题,怎么能判断单调递增呢,这里通过一个判断条件,如果遍历的nums[i]大于path.back(),那么证明这个数大于path内所有的数,可以push back,同时我门需要增加一个set,作用是去重,即如果发现遍历的nums[i]不在set里,那么可以push back,因为每次遍历的时候set都要insert nums[i]
class Solution {
public:
? ? vector<vector<int>> res;
? ? vector<int> path;
? ? void backTracking(vector<int>& nums, int startIndex) {
? ? ? ? if(path.size() > 1) {
? ? ? ? ? ? res.push_back(path);
? ? ? ? }
? ? ? ? unordered_set<int> uset;
? ? ? ? for(int i = startIndex;? i < nums.size(); i++) {
? ? ? ? ? ? if((path.size() > 0 && nums[i] < path.back()) || uset.find(nums[i]) != uset.end()) continue;
? ? ? ? ? ? uset.insert(nums[i]);
? ? ? ? ? ? path.push_back(nums[i]);
? ? ? ? ? ? backTracking(nums, i+1);
? ? ? ? ? ? path.pop_back();
? ? ? ? }
? ? }
? ? vector<vector<int>> findSubsequences(vector<int>& nums) {
? ? ? ? backTracking(nums, 0);
? ? ? ? return res;
? ? }
};
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
开始进入到排列问题,其实排列问题和组合问题很像,唯一的区别是组合里[1,2]和[2,1]是同一个,而排列不是,所以排列里不需要startIndex,但是排列也需要used数组来在横向遍历时判断这个数有没有被取过,因为每次横向遍历都是从第0位开始
class Solution {
public:
? ? vector<vector<int>> res;
? ? vector<int> path;
? ? void backTracking(vector<int>& nums, vector<int> used) {
? ? ? ? if(path.size() == nums.size()) {
? ? ? ? ? ? res.push_back(path);
? ? ? ? ? ? return;
? ? ? ? }
? ? ? ? for(int i = 0; i < nums.size(); i++) {
? ? ? ? ? ? if(used[i] == 1) continue;
? ? ? ? ? ? path.push_back(nums[i]);
? ? ? ? ? ? used[i] = 1;
? ? ? ? ? ? backTracking(nums, used);
? ? ? ? ? ? used[i] = 0;
? ? ? ? ? ? path.pop_back();
? ? ? ? }
? ? }
? ? vector<vector<int>> permute(vector<int>& nums) {
? ? ? ? vector<int> used(nums.size(), 0);
? ? ? ? backTracking(nums, used);
? ? ? ? return res;
? ? }
};
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
示例 1:
全排列多了一个去重操作,回溯问题的去重操作都是一样的:
if(i > 0 && nums[i] == nums[i-1] && used[i -1] == 0) continue;
还要记得将原数组sort一下
class Solution {
public:
? ? vector<vector<int>> res;
? ? vector<int> path;
? ? void backTracking(vector<int>& nums, vector<int> used) {
? ? ? ? if(path.size() == nums.size()) {
? ? ? ? ? ? res.push_back(path);
? ? ? ? ? ? return;
? ? ? ? }
? ? ? ? for(int i = 0; i < nums.size(); i++) {
? ? ? ? ? ? if(i > 0 && nums[i] == nums[i-1] && used[i -1] == 0) continue;
? ? ? ? ? ? if(used[i] == 0) {
? ? ? ? ? ? ? ? path.push_back(nums[i]);
? ? ? ? ? ? ? ? used[i] = 1;
? ? ? ? ? ? ? ? backTracking(nums, used);
? ? ? ? ? ? ? ? used[i] = 0;
? ? ? ? ? ? ? ? path.pop_back();
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? vector<vector<int>> permuteUnique(vector<int>& nums) {
? ? ? ? sort(nums.begin(), nums.end());
? ? ? ? vector<int> used(nums.size(), 0);
? ? ? ? backTracking(nums, used);
? ? ? ? return res;
? ? }
};