題目資訊:
給定乙個由若干 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陣列與...