46. 全排列

  1. 题目链接

  2. 解题思路:采取填数的方式,来到0下标,哪个数放在0下标?一个for循环,[0...]都可以放0下标。0下标填完之后,后续的操作不再处理0下标的,也就是说,哪个数放1下标?一个for循环,[1...]都可以放1下标(注意,不能动0下标的数了)。

  3. 代码

    class Solution {
    public:
    
        void mySwpap(vector<int> &nums, int i, int j) {
            int tmp = nums[i];
            nums[i] = nums[j];
            nums[j] = tmp;
        }
    
        // 现在处理[i...]的数,哪些数放在i位置?
        void process(vector<vector<int>> &ans, vector<int> &nums, int i) {
            if (i == nums.size()) {
                ans.push_back(nums);
                return ;
            }
            // 哪个数放i号位置?
            for (int j = i; j < nums.size(); ++j) {
                mySwpap(nums, i, j);
                process(ans, nums, i + 1);
                mySwpap(nums, i, j);    // 恢复现场
            }
        }
    
        vector<vector<int>> permute(vector<int>& nums) {
            vector<vector<int>> ans;
            process(ans, nums, 0);
            return ans;
        }
    };
    
posted @ 2024-12-20 10:50  ouyangxx  阅读(11)  评论(0)    收藏  举报