c_cpp 给定可能包含重复项的数字集合,返回所有可能的唯一排列。例如,[1,1,2]有以下内容

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 给定可能包含重复项的数字集合,返回所有可能的唯一排列。例如,[1,1,2]有以下内容相关的知识,希望对你有一定的参考价值。

// idea, first, sort the array!
// it seems like I do not need the visit array!!!

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

bool has_duplicates(vector<int> &nums, int begin, int i) {
  for(int j=begin; j<i; j++) 
    if(nums[j] == nums[i]) return true;
  return false;
}

void dfs(vector<vector<int>> &res, vector<int> &one, vector<bool> visit, 
         int start, int n, vector<int> &nums) {
           
    if(start == n) {
        res.push_back(one);
        return;
    }
    for(int i=start; i<n; i++) {
        //if(visit[i] == true) continue; // gist
        //if(i>start && nums[i] == nums[i-1] ) continue; // wrong!!!!!
        if(has_duplicates(nums, begin, i)) continue;
        swap(num[start], num[i]);
        
        one.push_back(nums[start]);
        dfs(res, one, visit, start+1, n, nums);
        one.pop_back();
        
        swap(num[start], num[i]);
    }
}

vector<vector<int>> get_premutation(vector<int> &nums) {
    vector<vector<int>> res;
    vector<int> one;
    vector<bool> visit(nums.size(), false);
    sort(nums.begin(), nums.end()); // gist!!!!
    dfs(res, one, visit, 0, nums.size(), nums);
    return res;
}

int main()
{
    vector<int> nums = {1, 1, 3, 2};
    vector<vector<int>> res = get_premutation(nums);
    for(vector<int> v : res) {
       for(auto i : v) cout << i << " ";
       cout << endl;
    }
    return 0;
}

以上是关于c_cpp 给定可能包含重复项的数字集合,返回所有可能的唯一排列。例如,[1,1,2]有以下内容的主要内容,如果未能解决你的问题,请参考以下文章

在递减然后递增并且可能包含重复项的列表中查找最小值

c_cpp 从一串单词中删除所有重复的单词。不只是重复,而是需要删除重复项的所有实例。

剑指 Offer II 082. 含有重复元素集合的组合

c_cpp 给定一组单词,返回给定集合中的anagrams集合

如何使用 LINQ 从一组数字中查找 n 项的所有组合?

Leetcode刷题Python剑指 Offer II 082. 含有重复元素集合的组合