1. 程式人生 > >飯後小甜點leetcode——Permutation全排列

飯後小甜點leetcode——Permutation全排列

基礎版全排列:

思路:
以此讓每一個當一下排頭兵,然後對排頭兵以後的進行遞迴。

程式碼:

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;
    }
}