【力扣】排列问题(回溯法)(memset函数初始化数组)
问题描述

排列问题的难点在于排列要求有序,并且在写的时候发现,如何在选择后面的元素后回过头去选择前面的元素,这是很难处理的,在前面的组合问题中,我们都是用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;
    }
};
大体上还是沿用回溯法的三部曲分析。
注意
在写这种数组时,总会被数组长度不能为变量,或者变量长度的数组不能用初始化列表的报错困扰,一个可行的解决方法是:
int num;
cin >> num;
int *arr = new int[num];
memset(arr, 0, sizeof(int)*num);

这样就省去了上面那种用for循环初始化的笨重的方法。

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号