考察知识点:回溯

回溯法的定义(来源:制心一处

回溯法(back tracking)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回到上一步,重新选择。

题目分析:

因为题目要求降序返回答案,所以我们先对nums进行排序,然后按照数组中数的顺序来进行递归回溯。这样数大的在前面并先被选择,就是我们的优选条件。

回溯法就是这样试探性地进行选择,当满足条件时就加入到结果中;否则就回溯回去,试探性选择下一个优选值。注意回溯时要恢复现场,消除由于上一次的选择所产生的影响。

所用编程语言:C++

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型vector<vector<>>
     */
    void dfs (vector<int> &nums, vector<int> &cows, vector<vector<int>> &res, vector<bool> st) {
        int size = nums.size();
        if (cows.size() == size) {
            res.push_back(cows);
            return;
        }

        for (int i = 0; i < size; i++) {
            if (st[i]) continue;
            cows.push_back(nums[i]);
            st[i] = true;
            dfs(nums, cows, res, st);
            st[i] = false;
            cows.pop_back();
        }
    }
    vector<vector<int> > cow_permute(vector<int>& nums) {
        // write code here
        sort(nums.begin(), nums.end(), greater<int>());
        vector<vector<int>> res;
        vector<int> cows;
        vector<bool> st(nums.size(), false);	//记录nums[i]是否被访问过
        dfs(nums, cows, res, st);
        return res;
    }
};