首页 > 其他分享 >【力扣】排列问题(回溯法)

【力扣】排列问题(回溯法)

时间:2024-03-09 16:55:57浏览次数:30  
标签:排列 nums res used 力扣 vector 回溯 path size

问题描述

image
排列问题的难点在于排列要求有序,并且在写的时候发现,如何在选择后面的元素后回过头去选择前面的元素,这是很难处理的,在前面的组合问题中,我们都是用startindex来处理,而在这里就行不通了。
容易想到的一种解决方法就是另外设置一个与nums长度相同的used数组来记录元素的遍历情况,也很难想到更合适的办法了。
试着写出代码如下:

class Solution {
public:
vector<vector<int>> res;
vector<int> path;
//int uesd[nums.size()] = {0};

void backtrace(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]){
            continue;
        }
        path.push_back(nums[i]);
        used[i] = 1;
        backtrace(nums,used);
        path.pop_back();
        used[i] = 0;
    }
}
    vector<vector<int>> permute(vector<int>& nums) {
        res.clear();
        path.clear();
        vector<int> used;
        for(int i = 0; i < nums.size(); i++){
            used.push_back(0);
        }
        backtrace(nums, used);
        return res;
    }
};

大体上还是沿用回溯法的三部曲分析。

标签:排列,nums,res,used,力扣,vector,回溯,path,size
From: https://www.cnblogs.com/satsuki26681534/p/18062911

相关文章

  • 【力扣】非递减子序列
    题目代码如下:classSolution{public:vector<vector<int>>res;vector<int>path;booloccured(vector<int>&nums,intkey,intstartindex){for(inti=startindex;i<key;i++){if(nums[key]==nums[i]){......
  • 【力扣】子集II(回溯法)(排序函数的一种隐藏用法?)
    题目描述可以套回溯模版的题,但是在写的过程中发现,如果数组中有多个相同元素分散存在的话,就会有一些子集无法得到像这里的1,4,4,如果对数组从左到右枚举的话是无论如何都得不到的。对这样的数组使用排序函数后,造成的效果就是相同的元素都堆在了一起,这样就能正确地得到所有子集......
  • 【力扣】复原IP地址(回溯法)(分割问题)
    问题描述在这个题中,因为结果的数据类型为vector<string>所以直接在s中添加分割点比较方便,先看一下代码:classSolution{private:vector<string>result;//记录结果//startIndex:搜索的起始位置,pointNum:添加逗点的数量voidbacktracking(string&s,intst......
  • 力扣回溯之 39. 组合总和
    //剪枝优化classSolution{  publicList<List<Integer>>combinationSum(int[]candidates,inttarget){    List<List<Integer>>res=newArrayList<>();    List<Integer>path=newArrayList<>();    A......
  • 【力扣】组合总和3(组合的去重)
    问题描述注意,如果数组里有两个元素的值相同,那么这两个元素是可以出现在同一个组合里的:但是:如果按前面的思路分析的话,会发现结果中出现很多相同的组合。像这样:这很明显是由于两个相同的1造成的,因为当前的startindex对应第一个1时,向下一层递归后,starindex定位的还是1,。如......
  • 【力扣】组合总数(回溯法)
    题目描述#include<iostream>#include<vector>usingnamespacestd;vector<vector<int>>res;vector<int>path;intaccumulate(vector<int>path){ intsum; for(inti=0;i<path.size();i++){ sum+=path[i]; } r......
  • 【力扣】电话号码的组合(回溯法)
    问题描述classSolution{public:vector<string>res;stringpath;//charA[26]={'a','b','c','d','e','f','g',//'h','i','j','k&......
  • 【力扣】求组合(回溯算法)
    题目描述2.以下是回溯算法的模版classSolution{private:vector<vector<int>>res;vector<int>path;//这个变量名还是设为path更合适voidbacktrace(intn,intk,intstartindex){//递归结束条件,这个是根据问题要求修改的if(path.s......
  • 力扣T26与T27的区别
    T27给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。T26你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一......
  • 【力扣】括号匹配(栈的应用)
    题目描述顾名思义代码如下:#include<iostream>#include<string>#include<stack>usingnamespacestd;boolisValid(strings){ if(s.empty()){ returntrue; } if(s.size()%2!=0){ returnfalse; } inti=0; stack<char>st; while(i<......