zoukankan      html  css  js  c++  java
  • [Leetcode] Permutations II

    Given a collection of numbers that might contain duplicates, return all possible unique permutations.

    For example,
    [1,1,2] have the following unique permutations:
    [1,1,2], [1,2,1], and [2,1,1].

    分析:思路与Permutations类似。 

         使用了具有剪枝函数的回溯思想。

       在交换时要遵循一个去重规则——去重的全排列就是从第一个数字起每个数分别与它后面非重复出现的数字交换。用编程的话描述就是第i个数与第j个数交换时,要求[i,j)中没有与第j个数相等的数。即每次交换前检查有没有曾经相同的数被交换过。

      详细分析请阅读:http://blog.csdn.net/xx77009833/article/details/17843415

    class Solution {
    public:
        vector<vector<int>> permuteUnique(vector<int>& nums) {
            vector<vector<int> > result;
            if (nums.empty()) return result;
            
            permuteUniqueRecur(nums, 0, nums.size() - 1, result);
            return result;
        }
        
        bool NoSwap(vector<int>& nums, int start, int end) {
            for (int i = start; i < end; i++) {
                if (nums[i] == nums[end])
                    return true;
            }
            
            return false;
        }
        
        void permuteUniqueRecur(vector<int>& nums, int start, int end, vector<vector<int> >& result) {
            if (start == end) {
                result.push_back(nums);
                return;
            } else {
                for(int i = start; i <= end; i++) {
                    if (NoSwap(nums, start, i)) //剪枝函数
                        continue;
                    swap(nums[i], nums[start]);
                    permuteUniqueRecur(nums, start + 1, end, result);
                    swap(nums[i], nums[start]);
                }
            }
        }
    };

      

  • 相关阅读:
    python开发mysql:索引
    学习笔记之English
    本周学习小结(25/03
    本周学习小结(18/03
    本周学习小结(11/03
    学习笔记之Machine Learning Crash Course | Google Developers
    本周学习小结
    学习笔记之Fluent Python
    Leetcode 4. Median of Two Sorted Arrays
    学习笔记之Python爬虫
  • 原文地址:https://www.cnblogs.com/vincently/p/4771000.html
Copyright © 2011-2022 走看看