3道回溯排列題46 47 784

2021-10-05 22:47:53 字數 1586 閱讀 4736

給乙個陣列,返回其所有排列組合情況。

input: [1,2,3]

output:

[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]

和前面回溯不一樣的是,每個解的長度是固定的,在回溯時需要訪問所有的元素,看哪個還沒有使用,所以用了乙個used陣列來記錄:

public list

>

permute

(int

nums)

list

> res =

newarraylist

<

>()

;public

void

help

(int

nums,

int index, list

one,

boolean

used)

else

}}

和上面一題區別就是給的陣列可能含有重複值。

所有**也差不多,唯一的區別就是先排個序,然後每次回溯時跳過重複的元素:

public list

>

permuteunique

(int

nums)

list

> res =

newarraylist

<

>()

;public

void

help

(int

nums,

int index, list

one,

boolean

used)

else

}}

給乙個字串,包含數字和字母,返回所有字母大小寫不同的可能的組合。

examples:

input: s = 「a1b2」

output: [「a1b2」, 「a1b2」, 「a1b2」, 「a1b2」]

這題區別就大一些了,之前的都是選擇不同的組合或者不同的排列,需要用到迴圈。但這題是對每個元素分別進行改變,看有多少種結果,不需要迴圈,但在遍歷到符合條件的元素時還需要再次進行回溯:

public list

lettercasepermutation

(string s)

list

res =

newarraylist

<

>()

;public

void

help

(int index, stringbuffer str)

else

else

if(str.

charat

(index)

>=

'a'&& str.

charat

(index)

<=

'z')

help

(index +

1, str);}

}}

刷題49 力扣3道題)

輸入整數陣列arr,找出其中最小的k個數。例如,輸入4 5 1 6 2 7 3 8這8個數字,則最小的4個數字是1 2 3 4。輸入 arr 3,2,1 k 2 輸出 1,2 或者 2,1 輸入 arr 0,1,2,1 k 1 輸出 0 1.寫sort數值排序 2.快速排序 法一 sort排序 寫s...

記一道數字旋轉排列演算法題

面試的時候遇到一道演算法題,當時沒做出來,也沒有什麼思路。睡覺前突然想到解法,記錄一下。題的大意如下,數字以1開始,並圍繞1做逆時針旋轉,其中1的座標為 0,0 如下圖所示 要求給乙個座標,求其未知的數是多少?例 給出 1,0 該座標的數為2 給出 1,2 該座標上的數為22。你可以先思考一下,或者...

線段樹3道超級基礎模板題

codevs 1080線段樹練習 單點修改 區間查詢 include define inf 0x3f3f3f3f const int maxn 1e5 5 using namespace std struct node tree 4 maxn int n,m int q,x,y int ans vo...