31題是求下一個排列。
寫這題大概花了我一兩的小時的時間吧。
寫完後就去玩樂了,結果呢,回來的時候突然看到46、47。
#46 Permutations
#47 Permutations II
一好奇點進去,46是給妳一個不重複的數列,請輸出全部的排列。
愣了一下,抱著47不會是允許重複吧?結果點開,還真是OAO
那......就作弊吧XD全部都用31題的function來解決囉~
[1,2,3]→[1,3,2]
[1,5,3]→[3,1,5]
[9,8,7]→[7,8,9]
應該不用細說也看得懂。
經過觀察,發現顯示出的下個數列將會是此數列可排成的下一個數字。
舉例來說
123 → 132 → 213 → 231 → 312 → 321 → 123
除卻最後一個,我輸入的數列,他的output就會是下一個數字。
class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        for(int i=nums.size()-1;i>0;i--)
        {
            if(nums[i-1]<nums[i])
            {
                int anchor=nums[i];
                int j=i,e=i;
                while(j<nums.size())
                {
                    if(anchor>nums[j]&&nums[j]>nums[i-1])
                    {anchor=nums[j];e=j;}
                    j++;
                }
                nums.erase(nums.begin()+e);
                nums.insert(nums.begin()+i-1,anchor);
                sort(nums.begin()+i,nums.end());
                return;
            }
        }
        sort(nums.begin(),nums.end());
    }
};
給你一個所有元素都不相同的數列,請輸出所有的排列。
都寫過31題了,還在等什麼?
class Solution {
public:
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>> ans;
        vector<int> end=nums;
        do{
            nums=nextPermutation(nums);
            ans.push_back(nums);
        }while(end!=nums);
        sort(ans.begin(),ans.end());
        return ans;
    }
    vector<int> nextPermutation(vector<int> nums) {
        for(int i=nums.size()-1;i>0;i--)
        {
            if(nums[i-1]<nums[i])
            {
                int anchor=nums[i];
                int j=i,e=i;
                while(j<nums.size())
                {
                    if(anchor>nums[j]&&nums[j]>nums[i-1])
                    {anchor=nums[j];e=j;}
                    j++;
                }
                nums.erase(nums.begin()+e);
                nums.insert(nums.begin()+i-1,anchor);
                sort(nums.begin()+i,nums.end());
                return nums;
            }
        }
        sort(nums.begin(),nums.end());
        return nums;
    }
};
給你一個數列,請輸出所有的排列。
我們31提早就也一樣解決數字重複的問題了,所以答案跟46一模模一樣樣。
class Solution {
public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        vector<vector<int>> ans;
        vector<int> end=nums;
        do{
            nums=nextPermutation(nums);
            ans.push_back(nums);
        }while(end!=nums);
        sort(ans.begin(),ans.end());
        return ans;
    }
    vector<int> nextPermutation(vector<int> nums) {
        for(int i=nums.size()-1;i>0;i--)
        {
            if(nums[i-1]<nums[i])
            {
                int anchor=nums[i];
                int j=i,e=i;
                while(j<nums.size())
                {
                    if(anchor>nums[j]&&nums[j]>nums[i-1])
                    {anchor=nums[j];e=j;}
                    j++;
                }
                nums.erase(nums.begin()+e);
                nums.insert(nums.begin()+i-1,anchor);
                sort(nums.begin()+i,nums.end());
                return nums;
            }
        }
        sort(nums.begin(),nums.end());
        return nums;
    }
};
簡簡單單、輕輕鬆鬆的一次解決3題,一個字 ── 爽!