zoukankan      html  css  js  c++  java
  • LeetCode 47 全排列II

    题目:

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

    示例:

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

    解题思路:

    与上一题相比,这题多了一个无重复条件。那即在上一题的基础上加上去重处理即可。

    去重办法:

    首先,为了判别存在重复的数字,我们可以让重复的数字紧靠在一起,这样就可以用 if(nums[i] == nums[i-1]) 这样的方法来判重。那怎么让重复的数字紧靠在一起呢? 使用sort从小到大排序。

    然后,使用上述的判重语句,并且只保留一个循环。

    注意:判重那行代码中 visited[i-1] == 0 的含义,为1时代表目前只有一个这样的排列,即第一个(1、1、2),我们只保留第一个。

    代码:

     1 class Solution {
     2 public:
     3     vector<vector<int>> permuteUnique(vector<int>& nums) {
     4         vector<vector<int>> ans;
     5         vector<int> out;
     6         vector<int> visited(nums.size(), 0);
     7         sort(nums.begin(), nums.end());
     8         perDFS(nums,0,visited,out,ans);
     9         return ans;
    10     }
    11     void perDFS(vector<int> nums, int lever, vector<int> &visited, vector<int> &out, vector<vector<int>> &ans) {
    12         if(lever == nums.size()){
    13             ans.push_back(out);
    14             return ;
    15         }
    16         for(int i=0; i<nums.size(); ++i){
    17             if(visited[i])
    18                 continue;
    19             if(i>0 && nums[i] == nums[i-1] && visited[i-1]==0) continue; //判重
    20             visited[i] = 1;  
    21             out.push_back(nums[i]);
    22             perDFS(nums,lever+1,visited,out,ans); 
    23             out.pop_back();       
    24             visited[i] = 0;
    25         }
    26     }
    27 };
  • 相关阅读:
    perl 获取铜板街页码
    $response->decoded_content 和$response->content
    基于Netty5.0高级案例之请求响应同步通信
    [Err] 1091
    [Err] 23000
    [Err] 42000
    perl 爬取 find_by_tag_name
    perl 爬取html findvalues 方法
    perl 安装DBI和DBD
    js setTimeout 参数传递使用介绍
  • 原文地址:https://www.cnblogs.com/moxiangfeng/p/10674351.html
Copyright © 2011-2022 走看看