47. 全排列 II

中等 數組 回溯 排序

前置題目:46. 全排列

思路

在上一個題目當中,我們會將數字換到當前位置,然後向下遞迴。
現在有重複項,那只要確保換到當前的數字沒有重複,就不會有重複的排列被產生。

程式碼

class Solution {
public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        int n = nums.size();
        vector<vector<int>> res;
        
        // i:當前所在的位置
        auto dfs = [&](this auto&&dfs, int i) -> void {
            if(i == n) {
                res.push_back(nums);
            }
            else {
                unordered_set<int> uset; // 去重
                for(int j = i; j < n; ++j) {
                    if(uset.find(nums[j]) == uset.end()) { // 確保換過來的數字沒有重複
                        swap(nums[i], nums[j]);
                        dfs(i + 1);
                        swap(nums[i], nums[j]);
                        uset.insert(nums[j]);
                    }
                }
            }
        };
        
        dfs(0);
        return res;
    }
};

複雜度分析

  • 時間複雜度:O(n×n!)O(n\times{n!})
  • 空間複雜度:O(n2)O(n^2)

顯示設定

背景線條
顯示背景網格線條
懸停發光
滑鼠懸停時顯示霓虹效果
聚光燈
跟隨滑鼠的聚光燈效果
背景透明度
開啟透明玻璃效果
主題顏色
自訂主要顏色