LeetCode題解 46 全排列

2021-10-04 03:20:17 字數 1981 閱讀 1620

leetcode中國,注意需要登入。

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

輸入: [1,2,3]

輸出:[

[1,2,3],

[1,3,2],

[2,1,3],

[2,3,1],

[3,1,2],

[3,2,1]

]

leetcode 給出本題難度中等。

根據給出序列,列出全排列。

根據樣例輸入資料 [1,2,3] ,我去,這麼簡單,不就是回溯演算法的經典例題嗎。給出 1 ~ n 的全排列。圖我就不畫了。

設計搜尋回溯函式可以套用套路。

1、先將函式原型寫出來。比如 void dfs()。

2、根據題目要求逐一分析需要幾個引數。我們用本題為例。

3、nums 這個陣列肯定是要傳遞的。

4、既然是搜尋,肯定需要位置控制。那麼這個也是乙個陣列定義,假設名字為 vis。

5、肯定需要乙個變數,表示已經搜尋到了幾個,假設名字為 cnt。

很清晰的知道,這個返回條件就是 cnt 的資料和 nums 陣列大小一樣。

class solution 

//引數1:path存放已經搜尋出了幾個資料

//引數2:vis表示

//引數3:n表示搜尋的最大資料

//引數4:left還剩下幾個數沒有搜尋到

void dfs(vector&path, vector&vis, int n, int left)

for (int i=1; i<=n; i++) }}

};

然後很開心地等待測試,結果如下,當頭一棒。

嗯,大佬你坑我嗎。竟然出現 0。於是開始改**,不就是在陣列 nums 裡搞鬼,這個我會解決,大不了我先排序。這樣我就知道最大值和最小值,然後從最小值到最大值搜尋就就可以。

class solution 

//引數1:path存放已經搜尋出了幾個資料

//引數2:vis表示

//引數3:開始

//引數4:結束

//引數4:cnt表示找到了幾個

void dfs(vector&path, vector& nums, vector&vis, int cnt)

for (int i=nums[0]; i<=nums[n-1]; i++) }}

};

然後很開心地等待測試,結果如下,懵逼了。什麼情況,竟然訪問到了 0x0000 位址去了,i 服了 u。

耐心仔細的讀了一下輸出,看了一下測試用例。我去,這個資料出得太出乎我的意料了。錯誤原來如下:

輸入 [0, -1, 1],排序後得到 [-1, 0, 1],我的搜尋**裡迴圈是 for (int i=nums[0]; i<=nums[n-1]; i++),也就是從 -1 到 1 的迴圈,而對應的 vis[i],變成了 vis[-1]、vis[0] 和 vis[1]。恭喜出現了陣列越界。天啊,這也太坑了。

還是自己沒有推敲清楚。所以不怕給恥笑,將整個過程貼了出來。還是老問題,資料要仔細推敲。

既然問題定位了,要解決問題就很容易。只需要修改迴圈起點和終點就可以了。

class solution 

//引數1:path存放已經搜尋出了幾個資料

//引數2:nums表示給定的資料

//引數3:vis訪問控制

//引數4:cnt表示找到了幾個

Leetcode題庫 46 全排列

author zzq software pycharm file permute.py time 2018 11 15 19 42 要求 給定乙個沒有重複數字的序列,返回其所有可能的全排列。示例 輸入 1,2,3 輸出 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 impo...

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...