#46. Permutations
題目描述
給你一個陣列nums
,陣列中的整數都是唯一的,回傳所有可能的排列組合。
你可以回傳任意順序排列的答案。
限制條件
- 1 <= nums.length <= 6
- -10 <= nums[i] <= 10
- 所有整數都是唯一的。
解題思路
排列組合很簡單,從陣列中一次拿取一個元素,直到沒有元素可以拿。
要注意的是,不能出現重複的排列組合,因此我們不能隨意挑選元素,只能按照順序來挑選元素。
執行步驟:
- 按照順序挑選元素。
- 將元素加入到暫時的排列組合陣列中。
- 如果是最後一個元素,則將完成的排列組合放進答案中。
- 如果陣列元素還有剩餘,則將刪去已經挑選的元素的陣列、暫時的排列組合陣列,放入下一次挑選中處理。
- 完成所有排列組合。
public class Solution {
public IList<IList<int>> Permute(int[] nums) {
var ans = new List<IList<int>>();
Helper(nums, new List<int>(), ans);
return ans;
}
public void Helper(int[] nums, List<int> tmp, List<IList<int>> ans){
for(int i=0; i<nums.Length;i++){
var newTmp = new List<int>(tmp);
newTmp.Add(nums[i]);
if(nums.Length==1) {
ans.Add(newTmp);
return;
}
Helper(nums.Except(new int[]{nums[i]}).ToArray(), newTmp, ans);
}
}
}
複雜度分析:
- 時間複雜度:進行排列組合的時候,會花費(n*(n-1))/2的時間,因此時間複雜度為O(n^2)。
- 空間複雜度:呼叫堆疊使用的空間會等於排列組合的長度,因此空間複雜度為O(n)。
學習重點
- Backtracking