• 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
  • 相关阅读:
    jvmidea远程调试服务
    JVMvisualVM远程连接服务器
    C语言isalpha()函数
    创建索引时加online和不加online有什么区别
    List<String>与逗号分隔的字符串互转
    突发感想(计算机原理)
    电脑上快捷键
    idm 破解注册
    8. 递归
    普通话水平测试 测试完后,一个月后即可查询成绩
  • 原文地址:https://www.cnblogs.com/mr-stn/p/8996947.html
Copyright © 2020-2023  润新知