LeetCode Sama的個人記錄 7

2021-10-05 05:52:49 字數 3448 閱讀 2510

▊【q31】(md)下乙個排列

實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。

如果不存在下乙個更大的排列,則將數字重新排列成最小的排列(即公升序排列)。

必須原地修改,只允許使用額外常數空間。

以下是一些例子:

1,2,3 → 1,3,2

3,2,1 → 1,2,3

1,1,5 → 1,5,1

class

solution

if(i >=0)

swap

(nums, i, j);}

reverse

(nums, i +1)

;}// 交換

private

void

swap

(int

nums,

int i,

int j)

// 倒序

private

void

reverse

(int nums,

int start)

}// 總結:

// 通過這道題,不僅要記住求下乙個字典值的方法(死記硬背),還要知道,在一些情況下,while語句比for語句清晰好用

}

▊【q200】(md)島嶼數量

給你乙個由 『1』(陸地)和 『0』(水)組成的的二維網格,請你計算網格中島嶼的數量。

島嶼總是被水包圍,並且每座島嶼只能由水平方向和/或豎直方向上相鄰的陸地連線形成。

此外,你可以假設該網格的四條邊均被水包圍。

示例 1:

輸入: 1 1 1 1 0

1 1 0 1 0

1 1 0 0 0

0 0 0 0 0

輸出: 1

示例 2:

輸入: 1 1 0 0 0

1 1 0 0 0

0 0 1 0 0

0 0 0 1 1

輸出: 3

解釋: 每座島嶼只能由水平和/或豎直方向上相鄰的陸地連線而成。

class

solution}}

return islandnum;

}private

void

combine

(char

grid,

int i,

int j)

else

if(grid[i]

[j]==

'1')

combine

(grid, i -

1, j)

;combine

(grid, i +

1, j)

;combine

(grid, i, j -1)

;combine

(grid, i, j +1)

;}}

class

solutionif(

isarea

(r, c +1)

&& grid[r]

[c +1]

=='1')if

(isarea

(r +

1, c)

&& grid[r +1]

[c]==

'1')if(

isarea

(r, c -1)

&& grid[r]

[c -1]

=='1')}

}}}return islandnum;

}private

boolean

isarea

(int i,

int j)

}

▊【q1248】(md)優美子陣列給你乙個整數陣列 nums 和乙個整數 k。

如果某個連續子陣列中恰好有 k 個奇數數字,我們就認為這個子陣列是「優美子陣列」。

請返回這個陣列中「優美子陣列」的數目。

示例 1

輸入:nums = [1,1,2,1,1], k = 3

輸出:2

解釋:包含 3 個奇數的子陣列是 [1,1,2,1] 和[1,2,1,1] 。

示例 2

輸入:nums = [2,4,6], k = 1

輸出:0

解釋:數列中不包含任何奇數,所以不存在優美子陣列。

示例 3

輸入:nums = [2,2,2,1,2,2,1,2,2,2], k = 2

輸出:16

class

solution

, k = 2

* 奇數為1和3;

* 左側有 4, 6,所以左側有3種可能(包括空)

* 右側有 8,所以右側有2中可能(包括空)

* 故而答案是: 3 * 2 = 6

* * 弄清楚規律,就可以考慮,該用何種演算法去實現?☆★☆【滑動視窗】

* 設雙指標l,r都從下標0開始移動;

* r先走,直到累計奇數為 k,r停下;

* 此時的左指標l和右指標r已經形成了乙個滿足條件的「視窗」,

* 下面企圖從左側(l)縮小這個視窗(跟進);從右側(r)擴大這個視窗;並且在同時記錄下左右指標分別可以移動的距離,用於相乘

* 包含用這k奇數的視窗已經完全遍歷完畢。下面使奇數計數oddnum減 1,r向右尋找下乙個奇數;l + 1,因為此時l指的就是上次用過的奇數

*/if(nums == null || nums.length ==0)

return0;

int res =0;

int l =0;

int r =0;

int oddnum =0;

while

(r < nums.length)

if(oddnum == k)

while

(r < nums.length &&

(nums[r]&1

)==0)

res +=

(lnum +1)

*(rnum +1)

;

l++;// 原先的第乙個奇數不再用了,l移開它

oddnum--

;// 左側拋棄乙個奇數,r向右側尋找下乙個奇數}}

return res;

}}

qs from

♣ loli suki

♠ end

LeetCode Sama的個人記錄 2

q7 ez 整數反轉給出乙個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。示例 1 輸入 123 輸出 321 示例 2 輸入 123 輸出 321 示例 3 輸入 120 輸出 21 注意 假設我們的環境只能儲存得下 32 位的有符號整數,則其數值範圍為 231,231 1 請根...

LeetCode Sama的個人記錄 12

q1371 md 每個母音包含偶數次的最長字串 給你乙個字串 s 請你返回滿足以下條件的最長子字串的長度 每個母音字母,即 a e i o u 在子字串中都恰好出現了偶數次。示例 1 輸入 s eleetminicoworoep 輸出 13 解釋 最長子字串是 leetminicowor 它包含 e...

LeetCode Sama的個人記錄 39

q141 ez 環形列表如果鍊錶中有某個節點,可以通過連續跟蹤 next 指標再次到達,則鍊錶中存在環。如果鍊錶中存在環,則返回 true 否則,返回 false 高階 使用常量空間 class solution listnode turtle head listnode rabbit head.n...