day29 代码回想录 递增子序列&全排列&全排列 II

大纲

  • 491.递增子序列
  • 46.全排列
  • 47.全排列 II

491.递增子序列

题目:491.递增子序列

// 491 递增子序列
// 要求返回所有递增的序列,
// 思路其实是在所有子集中筛选符合递增的子序列
// 递归结束条件:sliderIndex >= nums.size
// 递归内容: 遍历所有分割线往后的值,筛选符合条件的
// 参数:nums sliderIndex

// 怎么去除重复答案?
// 还差点 有问题
vector> ret;
vector path;

void increaseArray(vector& nums, int sliderIndex)
{
    if (path.size() > 1) {
        ret.push_back(path);
    }
    if (sliderIndex >= nums.size()) return;

    for (int i = sliderIndex; i < nums.size(); ++i) {
        // 去除相邻相同的重复结果
        if (i > sliderIndex && nums[i - 1] == nums[i])
            continue;
        // 比较过滤元素 nums[i] path[path.size() - 1]
        if (path.size() > 0 && path[path.size() - 1] > nums[i])
            continue;

        path.push_back(nums[i]);
        increaseArray(nums, i + 1);
        path.pop_back();
    }
}

vector> getIncreaseSubArray(vector& nums)
{
    increaseArray(nums, 0);
    return ret;
}

46.全排列

题目:46.全排列

// 46 所有的排列组合
// 和子集不一样的是 关系顺序和集合的元素个数都为所有元素
// 之前的回溯问题都可以看成为分割问题,将整个序列进行分割
// 而排列组合问题不一样了
// 是选择问题

//  需要记录哪些元素被选择了
// 需要记录path
// 递归结束条件:达到nums末尾
// 递归体:遍历所有可能,判断是否选择了
// 参数:nums index
vector path1;
vector> ret1;
vector selected;

void allDiffArray(vector& nums) {
    if (path1.size() >= nums.size()) {
        ret1.push_back(path1);
        return;
    }
    for (int i = 0; i < nums.size(); ++i) {
        if (selected[i] == false) {
            selected[i] = true;
            path1.push_back(nums[i]);
            allDiffArray(nums);
            path1.pop_back();
            selected[i] = false;
        }
    }
}
vector> permute(vector& nums) {
    selected = vector(nums.size(), false);
    allDiffArray(nums);
    return ret1;
}

你可能感兴趣的:(算法,c++,leetcode)