飯後小甜點leetcode——Permutation全排列
阿新 • • 發佈:2019-02-16
基礎版全排列:
思路:
以此讓每一個當一下排頭兵,然後對排頭兵以後的進行遞迴。
程式碼:
public class Solution {
public IList<IList<int>> Result = new List<IList<int>>();
public IList<IList<int>> Permute(int[] nums) {
GetPermute(nums, 0 , nums.Length-1);
return Result;
}
public void GetPermute(int[] nums, int start, int end){
if(start == end){//當只剩下一個元素的時候把結果存進去
var record = new List<int>();
foreach(var n in nums){
record.Add(n);
}
Result.Add(record);
}
for(var i=start;i<=end;i++){
//依次與start位置的交換
var temp = nums[start];
nums[start] = nums[i];
nums[i] = temp;
//遞迴
GetPermute(nums, start+1, end);
//再換回來
var temp2 = nums[start];
nums[start] = nums[i];
nums[i] = temp2;
}
}
}
升級版全排列(不能有重複記錄)
思路:
和上一個的不同就是,這個需要判斷一下for迴圈到的元素x是否在start之後x之前出現過,如果出現過,說明這個元素已經當過一次排頭兵了,就不用再當了。
程式碼:
public class Solution {
public IList<IList<int>> Result = new List<IList<int>>();
public IList<IList<int>> PermuteUnique(int[] nums) {
GetPermute(nums, 0 , nums.Length-1);
return Result;
}
public void GetPermute(int[] nums, int start, int end){
if(start == end){
var record = new List<int>();
foreach(var n in nums){
record.Add(n);
}
Result.Add(record);
}
for(var i=start;i<=end;i++){
//和上一個比較多了一個判斷條件
if(!HasAppeared(nums, start, i)){//判斷一下i在前面是否出現過,如果出現過就會造成重複
var temp = nums[start];
nums[start] = nums[i];
nums[i] = temp;
GetPermute(nums, start+1, end);
var temp2 = nums[start];
nums[start] = nums[i];
nums[i] = temp2;
}
}
}
public bool HasAppeared(int[] nums, int start, int index){
for(var i=start;i<index;i++){
if(nums[i]==nums[index]){
return true;
}
}
return false;
}
}