day9 51 數字排列(回溯)

2021-10-06 20:01:29 字數 1317 閱讀 7578

問題描述:

輸入一組數字(可能包含重複數字),輸出其所有的排列方式。

樣例:

採用遞迴的思路,對於乙個給定的陣列,首先要排好序,如果遇到陣列裡面有重複數字的情況,就要規定好這幾個重複數字的出現順序,比如上面的樣例,第乙個 1 出現之後,當放置第二個 1 的時候規定這個 1 在上乙個 1 出現位置的後面,前提是第乙個 1 放置的時候要從空缺位置中最前面的位置開始放置,否則這樣的規定順序會不成立。

首先確定start的起始位置,如果當前處理的是第乙個位置的數字,或者,下乙個數字與上乙個數字不一致的時候,此時 start 可以設定為0.

其次判斷當前位置是否空缺,沒有被數字占用,使用到的是二進位制。!(state>>i&1)表示state移動 i 位置後,該位置是否為0,如果空缺則將nums[u]的值填入path[u]中,並在下次安排數字順序的時候將該位置置為1。遞迴執行完畢後輸出結果。

class

solution

void

dfs(vector<

int>

&nums,

int u,

int start,

int state)if(

!u||nums[u]

!=nums[u-1]

) start=0;

for(

int i=start;i

size()

;i++)}}};

下面這個版本好理解,與leetcode 47 全排列ⅱ題目類似。重複的部分**於之前選擇了產生了左子樹,後來又選了2產生了右子樹。因此需要根據排序後的陣列相鄰元素是否相等來去重。去重的原則是相鄰的元素相等且後乙個運算沒有被訪問過即語句i>=1 &&nums[i]==nums[i-1] &&!used[i-1]其實去重邏輯中used[i-1]還可以是true,具體的解釋看**狂想錄鏈結

Day8 148 排序鍊錶

在 o n log n 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。示例 1 輸入 4 2 1 3 輸出 1 2 3 4 示例 2 輸入 1 5 3 4 0 輸出 1 0 3 4 5 結果 class solution 遞迴結束 if head.next null 快慢指標找中間節點 listn...

ACWing 842 排列數字

給定乙個正整數n nn,生成1 n 1 sim n 1 n的全排列,按照字典序輸出。輸入格式 共一行,包含乙個整數nnn。輸出格式 按字典序輸出所有排列方案,每個方案佔一行。資料範圍 1 n 7 1 le n le 7 1 n 7 思路是dfs。從1 11到n nn include include ...

day5 數字與列表

1.int 所有整數對應的型別 表示 數字直接寫 轉換 int 資料 不是所有的資料都可以轉換成整數,只有浮點數 布林 部分字串 print int 12.7 print int 1.9 print int true print int false print int asd 報錯 print in...