16 帶重複元素的排列

原題網址:https://www.lintcode.com/zh-cn/problem/permutations-ii/#html

給出一個具備重複數字的列表,找出列表全部不一樣的排列。面試

樣例

給出列表 [1,2,2],不一樣的排列有:編程

[
  [1,2,2],
  [2,1,2],
  [2,2,1]
]
挑戰 

使用遞歸和非遞歸分別完成該題。數組

標籤 
 
方法1.
不管是遞歸仍是非遞歸,能夠很雞賊的設置一個判斷函數,判斷result中是否存在當前要插入的數組(排列),說白了就是若當前排列與已有的排列不重複則push到result中。
 
這個判斷函數很好寫,兩個for循環就能夠搞定,參考: https://www.cnblogs.com/libaoquan/p/6986365.html 
 
我直接copy過來:
 bool isExist(vector<int> &nums, vector<vector<int> > &result) {
        int size = result.size();
        if(size == 0)
            return false;
        for(int i=0; i<size; i++) {
            if(isSameNums(nums, result[i])) {
                return true;
            }
        }
        return false;
    }

    bool isSameNums(vector<int> &nums1, vector<int> &nums2) {
        int size = nums1.size();
        for(int i=0; i<size; i++) {
            if(nums1[i] != nums2[i]) {
                return false;
            }
        }
        return true;
    }

感受子程序的設計能夠提升閱讀性便於理解,膜拜大佬。函數

其實在編程時能夠把大問題轉化爲小問題,一步一步解決,每一個功能的實現能夠編寫具體的函數(重複用到某個功能或者便於理解)。spa

 
 參照全排列,數組中有重複元素的話,相鄰的重複元素至關於一個元素,由於全排列只有一種,好比樣例中的【2,2】,這部分的全排列與【2】沒區別,固然再多幾個2也是同理。
因此能夠先排序,讓數組中相同元素相鄰。而後參照全排列的思路,不一樣之處是若nums[i]與上次循環中的nums[i]也即nums[start]相同直接跳出進行下一次判斷。
注意循環體內程序段在遞歸調用以後不須要再swap。
 
AC代碼:
 
class Solution {
public:
    /*
     * @param :  A list of integers
     * @return: A list of unique permutations
     */
    vector<vector<int>> permuteUnique(vector<int> &nums) {
        // write your code here
        vector<vector<int>> result;
    if (nums.empty())
    {
        result.push_back(nums);
        return result;
    }
    sort(nums.begin(),nums.end());
    perm(nums,0,result);
    return result;
    }
    
    
    void perm(vector<int> nums,int start,vector<vector<int>> &result)
{
    if (start==nums.size()-1)
    {
        result.push_back(nums);
    }
    for (int i=start;i<(int)nums.size();i++)
    {
        if (i==start||nums[i]!=nums[start])
        {
            swap(nums[start],nums[i]);//nums[start]爲上次循環的nums[i];
            perm(nums,start+1,result); //start值自己不變;
        
        }
    }
}

};
 
方法3. 非遞歸,用字典序。
 
字典序的方法適用於元素不重複的排序,也適用於帶重複元素的排列。
 
代碼參照15題。
 
 
4.其餘思路:
相關文章
相關標籤/搜索