給定乙個二進位制陣列, 計算其中最大連續1的個數。
輸入: [1,1,0,1,1,1]輸出: 3
解釋: 開頭的兩位和最後的三位都是連續1,所以最大連續1的個數是 3.
注意:刷到這道題的第一印象就是和之前的力扣053 最大子序和非常相似。可以用動態規劃(dp)的思想來解。輸入的陣列只包含 0 和1。 輸入陣列的長度是正整數,且不超過 10,000。
本題陣列是乙個線性結構,只需要用乙個一維陣列即可求解,關鍵是如何找出當前元素和上乙個元素之間的關係。
分析開始:由於二進位制陣列nums只會出現0或1兩種數字,所以討論0和1兩種情況即可。
我們開闢乙個與nums相同長度的陣列results,results中每乙個元素代表當前索引為止,nums的最大連續1個數。
我們只需要遍歷nums,當元素為1時,results[i] = results[i-1] + 1;當元素為0時,results[i] = 0(因為連續1序列結束了,此時的連續1個數為0)
class
solution
:def
findmaxconsecutiveones
(self, nums: list[
int])-
>
int:
results =[0
for i in
range
(len
(nums))]
results[0]
=1if nums[0]
==1else
0for i in
range(1
,len
(nums)):
if nums[i]==1
: results[i]
= results[i-1]
+1return
max(results)
這是本人最初寫的版本,總感覺寫的比較醜陋,不美觀。
其實完全可以在原陣列nums上進行修改(原地修改),不使用額外空間,一次遍歷既包含元素判斷,也包含元素更新。
下面是修改後的版本:
class
solution
:def
findmaxconsecutiveones
(self, nums: list[
int])-
>
int:
for i in
range(1
,len
(nums)):
if nums[i]==1
: nums[i]
= nums[i-1]
+1return
max(nums)
這裡有兩個小細節:
1、nums中元素為0的位置,不需要做判斷,直接跳過即可,因為0一旦出現,修改後的元素也為0,相當於是不需要修改。
2、nums首元素修改的值與修改前的值 是一定相等的,所以只需要從第二個元素(nums[1])開始遍歷即可。
這樣優化以後,感覺上邏輯差不多,但是提交後的執行用時卻短了不少。
485 最大連續1的個數
題目給定乙個二進位制陣列,計算其中最大連續1的個數。只包含0和1 常規思路一般想到的是都是遍歷陣列,用乙個變數記錄當前連續1的個數,另乙個變數記錄最大的長度,每當出現0就比較這兩個變數直到最後完成。但是這個題目我們可以用滑窗法來做 滑窗法滑動視窗法,可以用來解決一些查詢滿足一定條件的連續區間的性質等...
485 最大連續1的個數
給定乙個二進位制陣列,計算其中最大連續1的個數。示例 1 輸入 1 1,0 1,1 1 輸出 3解釋 開頭的兩位和最後的三位都是連續1,所以最大連續1的個數是 3 注意 輸入的陣列只包含 0 和1。輸入陣列的長度是正整數,且不超過 10,000。class solution def findmaxc...
485 最大連續1的個數
給定乙個二進位制陣列,計算其中最大連續1的個數。注意 輸入的陣列只包含 0 和1。輸入陣列的長度是正整數,且不超過 10,000。判斷陣列是否滿足注意條件,初始化變數x y,迴圈陣列,若為1則x 1,若為0則判斷y是否小於x,若小於則y x並且清空x,直到整個陣列迴圈完畢 class solutio...