国产探花免费观看_亚洲丰满少妇自慰呻吟_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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新绛县| 西乡县| 肇源县| 河西区| 湟源县| 邹平县| 苗栗县| 祁门县| 乌拉特中旗| 上栗县| 基隆市| 比如县| 平阳县| 武平县| 冷水江市| 玉树县| 东明县| 西平县| 高要市| 合川市| 江陵县| 郓城县| 孟津县| 青冈县| 南岸区| 和顺县| 天等县| 介休市| 定远县| 西峡县| 琼结县| 新营市| 津南区| 陵水| 基隆市| 上栗县| 剑川县| 浙江省| 滦平县| 大关县| 德钦县|