LeetCode日記 001 最大連續1的個數

2021-10-19 19:31:42 字數 3140 閱讀 9385

題目資訊:

給定乙個由若干 0 和 1 組成的陣列 a,我們最多可以將 k 個值從 0 變成 1 。

返回僅包含 1 的最長(連續)子陣列的長度。

例:

輸入:a = [1,1,1,0,0,0,1,1,1,1,0], k = 2

輸出:6

解釋:[1,1,1,0,0,1,1,1,1,1,1]

粗體數字從 0 翻轉到 1,最長的子陣列長度為 6。

本人思路(賤笑了):

完全按照題目資訊來思考,想著把0變為1,找出最長的合適子陣列。

先把陣列轉化為新的列表。列表元素為相鄰數字一樣的總數。

根據列表第乙個元素是0或1,分不同情況對列表進行拆分為兩個只存有0和1的列表。

對列表1進行遍歷,如果相同索引的列表0的值小於k,則1的個數為列表1和列表0當前值之和。此時k值減去用掉的列表0的值,向後邏輯一致。若下乙個列表0的值大於k值,就直接加k值就好了。

最後取遍歷後的最大子列表。

test_list =[0

,0,0

,1,1

,0,0

,1,1

,1,0

,1,1

,0,0

,0,1

,1,1

,1]# l = [2, 2, 2, 3, 1, 2, 3, 4]

# distance_list = [2, 2, 1, 3]

# count_list = [2, 3, 2, 4]

# # 2 + 2(3) + 3 + 1(3) + 2

# # new_list = list(enumerate(test_list))

# # print(new_list)

# new_list =

# count = 1

for t in

range

(len

(test_list)-1

):if test_list[t]

== test_list[t +1]

: count +=

1else

: count =

1if test_list[0]

==0: begin_0 = new_list[::

2]begin_1 = new_list[1:

:2]print

(begin_0)

print

(begin_1)

max_count =

0for i in

range

(len

(begin_1)):

k =3 current_count = begin_1[i]

for j in

range

(i,len

(begin_0)):

if begin_0[j]

< k:

k -= begin_0[j]

if i ==0:

current_count += begin_0[j]

else

: current_count +=

(begin_0[j]

+ begin_1[i -1]

)elif begin_0[j]

> k:

current_count += k

break

elif begin_0[j]

== k:

current_count +=

(k + begin_1[i -1]

)break

max_count = max_count if current_count < max_count else current_count

else

: begin_0 = new_list[1:

:2] begin_1 = new_list[::

2]max_count =

0for i in

range

(len

(begin_1)):

k =3 current_count = begin_1[i]

for j in

range

(len

(begin_0)):

if begin_0[j]

< k:

k -= begin_0[j]

current_count += begin_0[j]

else

: current_count += k

break

max_count = max_count if current_count < max_count else current_count

print

(max_count)

題意轉換。把「最多可以把 k 個 0 變成 1,求僅包含 1 的最長子陣列的長度」轉換為 「找出乙個最長的子陣列,該子陣列內最多允許有 k 個 0 」。

定義兩個變數left, right為0。使用right遍歷列表,逐步向右滑動,若left、right之間的0值大於k,則left逐步加1,保證兩個值之間的0始終在範圍k內。

left_index, zeros, max_count =0,

0,0for i in

range

(len

(test_list)):

if test_list[i]==0

: zeros +=

1while zeros >3:

if test_list[left_index]==0

: zeros -=

1 left_index +=

1 max_count =

max(max_count, i - left_index +1)

print

(max_count)

個人總結:

透過現象看本質,不要被題目資訊所迷惑。要擁有發散型思維。fighting!!!

注:

LeetCode日記 239 滑動視窗的最大值

題目描述 給定乙個陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗內的 k 個數字。滑動視窗每次只向右移動一位。返回滑動視窗中的最大值。高階 示例 輸入 nums 1,3,1,3,5,3,6,7 和 k 3 輸出 3,3,5,5,6,7 解釋 滑動...

LeetCode刷題日記 53 最大子序和

題目給出乙個整數陣列nums,要求在陣列中找到具有最大和的連續子陣列。這裡首先使用暴力求解法,如下 class solution return maxsum 這段 在遇到陣列 2,1 時,會返回0。這是以為對maxsum的初始值設定為0,當實際maxsum比0還小的時候,就會返回0。為了修改這個bu...

LeetCode 刷題記錄 001

給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數。你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 7 9 所以返回 0,1 思路 使用hashmap儲存在遍歷的同時nums陣列與...