[lintCode] -- Permutations II

  • 好,今天的第二题,正好和上一道题是接着的

  • 大体思路

    刚开始以为以为只要nums[i]和nums[n]相等,就不做交换这样做就可以。但是后来想到每次交换完顺序都会变乱,所以这种方法行不通。然后又想了另一种方法,就是每次交换的时候判断在当前顺序中是不是已经交换过,既在i到j-1范围内没有和nums[j]相等的数,那么就交换,否则continue

    class Solution {
    public:
      /*
       * @param nums: A list of integers.
       * @return: A list of permutations.
       */
    
      vector<vector<int>> permuteUnique(vector<int> &nums) {
          // write your code here
          vector<vector<int>> so;
          fullarrange(nums, nums.size(), 0, so);
          return so;
      }
    
      void swap(int &a, int &b){
         int t = a;
         a = b;
         b = t;
       }
    
      void fullarrange(vector<int> &nums, int size, int n, vector<vector<int>> &so){
         if(n == size){
           so.push_back(nums);
           return;
         }
         for(int i=n; i<size; i++){
           if(find(nums, n, i, nums[i]))
             continue;
           else{
             swap(nums[i], nums[n]);
             fullarrange(nums, size, n+1, so);
             swap(nums[i], nums[n]);
           }
         }
       }
    
       bool find(vector<int> &nums, int st, int ed, int target){
         for(int i=st; i<ed; i++)
          if(nums[i] == target)
            return true;
         return false;
       }
    };
  • 题目链接: https://www.lintcode.com/problem/permutations-ii/description

猜你喜欢

转载自blog.csdn.net/qq_24889575/article/details/81877445