zoukankan      html  css  js  c++  java
  • 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——函数
    python——文件操作
    python——字符编码
    【转】基于jquery的无刷新表格分页
    js console.log 打印 对像 数组 详解
    百度地图自己添加 标识地点 代码
    在线提取PDF中图片和文字
    安全cookie登录状态设计方案
    iScroll 下拉刷新
    WebSQL实例记录
  • 原文地址:https://www.cnblogs.com/mr-stn/p/8996947.html
Copyright © 2011-2022 走看看