• leetcode 47. 全排列 II


    给定一个可包含重复数字的序列,返回所有不重复的全排列。

    示例:

    输入: [1,1,2]
    输出:
    [
      [1,1,2],
      [1,2,1],
      [2,1,1]
    ]


    思路和上一题类似,知识这里要判断当前元素是否在前面出现过
    http://www.cnblogs.com/mr-stn/p/8996779.html
     1 class Solution {
     2 public:
     3    bool contain(vector<int>nums, int i, int j){
     4        for(int k = i; k < j; k++)
     5            if(nums[j] == nums[k]) return true;
     6        return false;
     7    }
     8     void permuteUnique(vector<int>&nums, vector<vector<int>>& ans, int begin, int end){
     9         if(begin == end){
    10             ans.push_back(nums);
    11             return;
    12         }else{
    13             for(int i = begin; i <= end; i++){
    14                 if(contain(nums, begin, i)) continue;
    15                 swap(nums, begin, i);
    16                 permuteUnique(nums, ans, begin+1, end);
    17                 swap(nums, begin, i);
    18             }
    19         }
    20     }
    21     
    22     void swap(vector<int>& nums, int i, int k){
    23         int temp = nums[i];
    24         nums[i] = nums[k];
    25         nums[k] = temp;
    26     }
    27     
    28     vector<vector<int>> permuteUnique(vector<int>& nums) {
    29         vector<vector<int>> ans;
    30         int len = nums.size()-1;
    31         permuteUnique(nums, ans, 0, len);
    32         return ans;
    33     }
    34 };

    发现一种更优的解法, 就是在传递nums的时候不用引用,这样就只需要一次交换。判断是否是重复元素也方便很多

    此外在调用函数前要先对nums进行排序

     1 class Solution {
     2 public:
     3     void permuteUnique(vector<int>nums, vector<vector<int>>& ans, int begin, int end){
     4         if(begin == end){
     5             ans.push_back(nums);
     6             return;
     7         }else{
     8             for(int i = begin; i <= end; i++){
     9                 if(i > begin&&nums[i]==nums[begin]) continue;
    10                 swap(nums[begin], nums[i]);
    11                 permuteUnique(nums, ans, begin+1, end);
    12             }
    13         }
    14     }
    15     
    16     vector<vector<int>> permuteUnique(vector<int>& nums) {
    17         vector<vector<int>> ans;
    18         int len = nums.size()-1;
    19         sort(nums.begin(), nums.end());
    20         permuteUnique(nums, ans, 0, len);
    21         return ans;
    22     }
    23 };
    有疑惑或者更好的解决方法的朋友,可以联系我,大家一起探讨。qq:1546431565
  • 相关阅读:
    python中计算程序用时的方法
    既生list何生tuple
    SSAS-时间维度的标准设计
    1092 最好吃的月饼 (20 分
    1091 N-自守数 (15 分)
    1149 Dangerous Goods Packaging (25 分)
    1148 Werewolf
    1144 The Missing Number (20 分)
    1141 PAT Ranking of Institutions (25 分)
    1140 Look-and-say Sequence (20 分)
  • 原文地址:https://www.cnblogs.com/mr-stn/p/8996947.html
Copyright © 2020-2023  润新知