淮安哪里有做網(wǎng)站的北京網(wǎng)站seo技術(shù)廠(chǎng)家
題目要求
思路
1.同【沒(méi)有重復(fù)項(xiàng)的全排列-97】這個(gè)題一樣,都是遞歸的題,區(qū)別在于這個(gè)可能會(huì)包含重復(fù)的數(shù)字,因此,不能只是簡(jiǎn)單的通過(guò)兩個(gè)值是否相等然后用標(biāo)志位標(biāo)記,而是新增了一個(gè)數(shù)組,這個(gè)數(shù)組專(zhuān)門(mén)用于存儲(chǔ)該元素是否被使用。
2.需要特殊處理的是,類(lèi)似【1,2,1】的這種的結(jié)果可能會(huì)有兩個(gè),這是因?yàn)閮蓚€(gè)1的下標(biāo)不同,這時(shí)我們可以對(duì)最初的元素進(jìn)行排序,如果某個(gè)元素是重復(fù)元素,并且之前已經(jīng)使用過(guò),就跳過(guò)該元素。
if(i > 0 && num[i-1] == num[i] && !vis[i-1])continue;
代碼實(shí)現(xiàn)
class Solution {
public:vector<vector<int>> res;vector<vector<int> > permuteUnique(vector<int>& num) {sort(num.begin(), num.end());//標(biāo)記vector<int> vis(num.size(), 0);vector<int> n;per(num, n, vis);return res;}void per(vector<int>& num, vector<int>& n, vector<int>& vis){if(num.size() == n.size()){res.push_back(n);return;}for(int i = 0; i < num.size(); i++){if(vis[i])continue;if(i > 0 && num[i-1] == num[i] && !vis[i-1])continue;vis[i] = 1;n.push_back(num[i]);per(num, n, vis);vis[i] = 0;n.pop_back();}}
};