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

    1. 题目

    2. 解答

    LeetCode 46——全排列 中我们已经知道,全排列其实就是先确定某一个位置的元素,然后余下就是一个子问题。在那个问题中,数据没有重复,所以数据中的任意元素都可以放在最后一个位置。

    但是,如果数据有重复的话,重复的数据都放在最后则是一样的结果,我们需要进行一个去重。在这里,我们对数据先进行一个排序,然后依次把每个数据都交换到第一个位置,如果它和第一个数据不相等的话,而且我们不用再交换回来,最后递归求解子问题即可。

    比如数据 [1, 3, 3, 4],第一次交换为 [1, 3, 3, 4],1 为第一个元素;第二次交换为 [3, 1, 3, 4],3 为第一个元素;第三次交换时 3 和 3 相等,重复情况不交换;第四次交换为 [4, 1, 3, 3],4 为第一个元素。可以看到,这样的话第一个元素总共有三种情况,然后分别递归即可。

    class Solution {
    
        vector<vector<int>> result;
    
    public:
        vector<vector<int>> permuteUnique(vector<int>& nums) {
            
            int n = nums.size();
            sort(nums.begin(), nums.end());
            Generate_Premutations(nums, 0, n-1);
            return result;       
        }
        
        void Generate_Premutations(vector<int> nums, int left, int right)
        {
            if (left == right)
            {
                result.push_back(nums);
            }
            else
            {
                for (int i = left; i <= right; i++)
                {
                    if (i != left && nums[i] == nums[left])   continue; 
                    // 交换后就不再交换回来了,需传值而不是传引用,否则递归调用就会改变数组
                    swap(nums[left], nums[i]);
                    Generate_Premutations(nums, left+1, right);          
                }
            }
        }
    };
    
    

    获取更多精彩,请关注「seniusen」!

  • 相关阅读:
    自动化测试初介
    接口测试初介
    常见测试面试过程及及问题解析
    hadoop伪分布式平台组件搭建
    使用Github搭建个人博客
    centos7中redis安装配置
    Hive安装配置
    hadoop大数据组件启动
    Java生成窗口
    正则语法
  • 原文地址:https://www.cnblogs.com/seniusen/p/10942400.html
Copyright © 2011-2022 走看看