leetcode Permutations II

来源:互联网 发布:62078端口入侵iphone 编辑:程序博客网 时间:2024/06/18 01:42

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].

采用回溯法,因为当前的元素如果在本次没有被选中,需要在以后被选中。所以这里并不是单纯地将num[i],加入到aresult中。而是swap(num[i],num[left]),然后aresult中加入num[left],之后回溯;

当我们枚举第i个位置的元素时,若要把后面第j个元素和i交换,则先要保证[i…j-1]范围内没有和位置j相同的元素。


class Solution {public:    vector<vector<int> > permuteUnique(vector<int> &num) {        sort(num.begin(),num.end());        vector<vector<int>> result;        vector<int> aresult;        sub(result,aresult,num,0);        return result;    }    void sub(vector<vector<int>> &result,vector<int> &aresult,vector<int>&num,int left){        if(left>num.size()) return;        if(left==num.size()){            result.push_back(aresult);            return;        }        for(int i=left;i<num.size();i++){            if(i == left || !find(num, left, i, num[i])){            swap(num[left],num[i]);            aresult.push_back(num[left]);            sub(result,aresult,num,left+1);            aresult.pop_back();            swap(num[left],num[i]);        }        }    }    bool find(vector<int> &num, int start, int end, int target)    {        for(int i = start; i < end; i++)            if(num[i] == target)                return true;        return false;    }};


0 0
原创粉丝点击