LeetCode46 全排列,java實現

2021-09-20 04:01:41 字數 1385 閱讀 2134

給定乙個沒有重複數字的序列,返回其所有可能的全排列。

示例:

輸入: [1,2,3]

輸出:[

[1,2,3],

[1,3,2],

[2,1,3],

[2,3,1],

[3,1,2],

[3,2,1]

]

解法1:字典排序

思路:1.先對nums進行從小到大排序,否則答案會缺失,同時先把排序後的陣列放到result中

2.接下來進行字典排序,從後向前找到第乙個當前數比它後面數小的,把這個數a拿出來

3.再從後向前,在最後乙個數到a之間找到第乙個比a大的數,調換它們的位置

4.對a後面的數進行從小到大排序,現在得到全排列中的其中乙個,把這個排列放到result中,接著再從後向前找第乙個當前數比後面乙個數小的,把這個數temp拿出來........................,一直迴圈直到i不再大於等於0(要注意每次得到乙個排列後,i都要置為nums.length-2)

**:

class solution

result.add(first);

int i = nums.length - 2;

while(i >= 0)

}nums = quick_sort(nums, i+1, nums.length-1);//對a後面的數從小到大排序

listsub = new arraylist();

for (int t = 0; t < nums.length; t++)

result.add(sub);

i = nums.length-2;

}else

}return result;

} public int quick_sort(int a, int left, int right)

if (l < r)

while(l < r && a[l] < temp)

if (l < r)

}a[l] = temp;

quick_sort(a, left,l-1 );

quick_sort(a, l+1, right);

}return a;

}}

解法2:遞迴

**:

class solution 

public void perm(int nums, int start, int end)

this.result.add(list);

}else

}

}public void swap(int nums,int p, int q)

}

leetcode 46 全排列(回溯)

給定乙個沒有重複數字的序列,返回其所有可能的全排列。示例 輸入 1,2,3 輸出 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 核心的遞迴部分如下 for begin in range 0 n for i in range begin,n swap nums begin n...

LeetCode 46 全排列(回溯)

給定乙個沒有重複數字的序列,返回其所有可能的全排列。示例 輸入 1,2,3 輸出 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 類似題目 leetcode 996.正方形陣列的數目 回溯 剪枝 class solution void bt vector int nums,i...

演算法 leetcode46全排列

leetcode 全排列 給定乙個 沒有重複 數字的序列,返回其所有可能的全排列。示例 輸入 1 2,3 輸出 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 這道題我們需要使用回溯的方法來進行求解。那我們回溯法的解體框架是什麼呢,解決乙個回溯問題,實際上就是乙個決策樹的遍歷...