国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

字符串應用之全排列

2019-11-11 05:27:21
字體:
來源:轉載
供稿:網友

之前在leetcode做過全排列的題目,LeetCode46和LeetCode47分別是不帶重復元素和帶重復元素的全排列,當時圖個簡單,直接用STL的next_permutation去做了,這一次把遞歸算法學習了一遍。

不重復元素的全排列

對于1234….n這樣的全排列,他的全排列有n!種,因此求解該問題的時間復雜度為n!。其實要求全排列,無非就是對元素進行交換,使他們出現在不同的位置。

代碼

class Solution { PRivate: void func(vector<vector<int>>&res,vector<int>&nums,int n) { if(n==nums.size()-1) { res.push_back(nums); return; } for(int i=n;i<nums.size();++i) { swap(nums[i],nums[n]); func(res,nums,n+1); swap(nums[i],nums[n]); } }public: vector<vector<int>> permute(vector<int>& nums) { vector<vector<int>>res; func(res,nums,0); return res; }};

重復元素的全排列

由于我們是迭代的交換元素,當迭代到某個元素時,如果前面出現過一樣的元素,那么就無需再做這次交換了。

代碼

class Solution { #if 1 bool dup(vector<int>&nums,int n,int t) { for(int j=n;j<t;++j) { if(nums[j]==nums[t]) return true; } return false; } #endif void func(vector<vector<int>>&res,vector<int>&nums,int n) { if(n==nums.size()-1) { res.push_back(nums); return; } for(int i=n;i<nums.size();++i) { if(dup(nums,n,i)) { continue; } swap(nums[i],nums[n]); func(res,nums,n+1); swap(nums[i],nums[n]); } }public: vector<vector<int>> permuteUnique(vector<int>& nums) { vector<vector<int>>res; func(res,nums,0); return res; }};

降低時間復雜度

由于迭代的判斷是否重復會增加時間復雜度,我們可以用一個set保存出現過的元素,空間換時間。

class Solution { #if 0 bool dup(vector<int>&nums,int n,int t) { for(int j=n;j<t;++j) { if(nums[j]==nums[t]) return true; } return false; } #endif void func(vector<vector<int>>&res,vector<int>&nums,int n) { if(n==nums.size()-1) { res.push_back(nums); return; } // visit.clear(); // unordered_map<int,int>dup; unordered_set<int>dup; for(int i=n;i<nums.size();++i) { if(dup.find(nums[i])!=dup.end()) continue; dup.insert(nums[i]); /* if(dup(nums,n,i)) { continue; } */ swap(nums[i],nums[n]); func(res,nums,n+1); swap(nums[i],nums[n]); } }public: vector<vector<int>> permuteUnique(vector<int>& nums) { vector<vector<int>>res; func(res,nums,0); return res; }};
上一篇:.net 第二章上機練習1

下一篇:Hdu 1237

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 正阳县| 镇远县| 晴隆县| 吴堡县| 大方县| 德江县| 金塔县| 越西县| 佳木斯市| 海宁市| 内黄县| 高碑店市| 上虞市| 宜城市| 竹溪县| 全椒县| 双辽市| 大厂| 聊城市| 泰宁县| 个旧市| 乌拉特后旗| 山东省| 吐鲁番市| 长顺县| 左云县| 武夷山市| 武胜县| 贡山| 溧阳市| 江都市| 开原市| 商城县| 鹤山市| 信宜市| 万荣县| 运城市| 浦北县| 龙里县| 渝中区| 正蓝旗|