生活随笔
收集整理的這篇文章主要介紹了
LeetCode 46. 全排列(回溯)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1. 題目信息
- 2. 解題
- 2.1 利用hash map解決
- 2.2 改用bool數組判斷是否出現過
1. 題目信息
給定一個沒有重復數字的序列,返回其所有可能的全排列。
示例:輸入: [1,2,3]
輸出:
[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]
]
來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/permutations
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
類似題目:
LeetCode 996. 正方形數組的數目(回溯+剪枝)
2.1 利用hash map解決
- 在hash map中查找不到的元素,將其push進數組
- 遞歸處理
class Solution {
public:vector
<vector
<int>> permute(vector
<int>& nums
) {vector
<int> row
;vector
<vector
<int>> ans
;unordered_map
<int, int> m
;bt(nums
, 0, m
, row
, ans
);return ans
;}void bt(vector
<int>& nums
, int count
, unordered_map
<int, int> m
, vector
<int> row
, vector
<vector
<int>>& ans
){if(count
== nums
.size()){ans
.push_back(row
); return;}for(int i
= 0; i
< nums
.size(); ++i
){if(m
.find(i
) == m
.end()){m
[i
] = 1;row
.push_back(nums
[i
]);bt(nums
,count
+1,m
,row
,ans
);row
.pop_back();m
.erase(i
);}}}
};
2.2 改用bool數組判斷是否出現過
用bool數組做判斷,節省內存
class Solution {
public:vector
<vector
<int>> permute(vector
<int>& nums
) {vector
<int> row
;vector
<vector
<int>> ans
;bool occurred
[nums
.size()];memset(occurred
, 0, sizeof(bool)*nums
.size());bt(nums
, 0, occurred
, row
, ans
);return ans
;}void bt(vector
<int>& nums
, int count
, bool *occurred
, vector
<int> row
, vector
<vector
<int>>& ans
){if(count
== nums
.size()){ans
.push_back(row
); return;}for(int i
= 0; i
< nums
.size(); ++i
){if(occurred
[i
] == false){occurred
[i
] = true;row
.push_back(nums
[i
]);bt(nums
,count
+1,occurred
,row
,ans
);row
.pop_back();occurred
[i
] = false;}}}
};
class Solution:def permute(self
, nums
: List
[int]) -> List
[List
[int]]:import itertools
return list(itertools
.permutations
(nums
, len(nums
)))
32 ms 15.1 MB Python3
總結
以上是生活随笔為你收集整理的LeetCode 46. 全排列(回溯)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。