国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

算法通關(guān)村第十六關(guān):青銅挑戰(zhàn)-滑動窗口其實很簡單

這篇具有很好參考價值的文章主要介紹了算法通關(guān)村第十六關(guān):青銅挑戰(zhàn)-滑動窗口其實很簡單。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

青銅挑戰(zhàn)-滑動窗口其實很簡單

1. 滑動窗口基本思想

數(shù)組引入雙指針的背景:
很多算法會大量移動數(shù)組中的元素,頻繁移動元素會導致執(zhí)行效率低下或者超時,使用兩個變量能比較好的解決很多相關(guān)問題

數(shù)組雙指針,之前介紹過 對撞型 和 快慢型 兩種,滑動窗口思想就是快慢型的特例

滑動窗口

示例:

如下圖所示,假設窗口是3,當不斷有新數(shù)據(jù)來時,維護一個大小為3的一個區(qū)間,超過3就將新的放入,老的移走。
過程有點像火車在鐵軌上跑。原始數(shù)據(jù):鐵軌,小區(qū)間:長度固定的火車。

有了區(qū)間,可以造題了,如找序列上連續(xù)3個數(shù)組的最大和是多少?

所謂窗口,就是建立兩個索引left和right,保持 {left,right} 之間一共有3個元素,然后一邊遍歷序列,一邊尋找,每改變一下就標記一下當前區(qū)間的最大和

算法通關(guān)村第十六關(guān):青銅挑戰(zhàn)-滑動窗口其實很簡單,算法,python

掌握窗口和滑動的概念

窗口

  • 兩個變量left和right之間的元素,可以理解為一個區(qū)間
  • 窗口可能固定,也可能變化
    如果固定,需要先確定窗口是否越界
    如果不固定,先判斷是否滿足要求,在執(zhí)行邏輯處理

滑動

  • 說明窗口是移動的,移動的是left和right兩個變量,而不是序列中的元素
  • left和right變量移動時,區(qū)間內(nèi)元素發(fā)現(xiàn)變化

實際問題,窗口大小固定與不固定的兩種場景

  1. 窗口大小固定:火車行駛
  2. 窗口大小不固定:兩個老師帶隊學生外出,一個開路,一個斷后,中間學生。兩位老師之間的距離時大時小。

根據(jù)窗口大小固定與否,兩種類型的題

  1. 固定:一般求哪個窗口的元素最大、最小、平均值、和最大、和最小等
  2. 不固定:一般求一個序列里最大、最小窗口是什么等

滑動窗口解題吃力的原因:

  1. 解題最終要落實到數(shù)組,特別是邊界處理容易暈
  2. 有些元素的比較、判斷比較麻煩,不僅要借助集合等工具,而且處理過程中還有一些技巧,不熟悉會導致解題難度大
  3. 堆!堆結(jié)構(gòu)非常適合在流數(shù)據(jù)中找固定區(qū)間內(nèi)的最大、最小等問題。因此滑動窗口經(jīng)常和堆一起使用解決復雜的問題

滑動窗口和雙指針的區(qū)別

  • 滑動窗口是雙指針的一種類型;
  • 滑動窗口主要關(guān)注兩個指針之間元素的情況,應用范圍更小一些;
  • 雙指針的應用范圍更大,花樣也更多。

2. 兩個入門題

2.1 子數(shù)組最大平均數(shù)

LeetCode 643
https://leetcode.cn/problems/maximum-average-subarray-i/

思路分析

典型的滑動窗口,窗口大小固定了,就是K
先讀取K個,然后逐步讓窗口向前走就可以了

代碼實現(xiàn)文章來源地址http://www.zghlxwxcb.cn/news/detail-707093.html

class Solution:
    def findMaxAverage(self, nums: List[int], k: int) -> float:
        window_sum = 0
        # 第一步:求第一個窗口的和
        for i in range(k):
            window_sum += nums[i]

        # 第二步:遍歷,每次右邊增加一個,左邊減去一個,重新計算窗口的最大值
        res = window_sum
        left = 0
        for right in range(k, len(nums)):
            window_sum = window_sum + nums[right] - nums[left]
            res = max(res, window_sum)
            left += 1
        
        return res/k
2.2 最長連續(xù)遞增序列

LeetCode674
https://leetcode.cn/problems/longest-continuous-increasing-subsequence/

思路分析

方法1:滑動窗口
這是一個窗口大小變化的題目

算法通關(guān)村第十六關(guān):青銅挑戰(zhàn)-滑動窗口其實很簡單,算法,python

如圖所示,實例序列 1,3,5,4,7,8,9,2 最長遞增子序列 4,7,8,9 結(jié)果應返回4

我們可以從第2個元素開始,定義 [left, right] 區(qū)間來表示當前的遞增區(qū)間,執(zhí)行如下操作

  • 當前遍歷的元素比它左邊的元素大,right增加
  • 否則就將left跳到right的起始位置,重新開始計算

方法2:
一邊遍歷,一邊統(tǒng)計每個遞增區(qū)間的長度,如果長度超過之前左右區(qū)間的長度,將其保留

代碼實現(xiàn)

class Solution:
    def findLengthOfLCIS(self, nums: List[int]) -> int:
        # 方法1:滑動窗口
        res = 1
        left = 0
        for right in range(1, len(nums)):
            if nums[right] <= nums[right - 1]:
                left = right
            res = max(right - left + 1, res)
        return res
class Solution:
    def findLengthOfLCIS(self, nums: List[int]) -> int:
        # 方法2
        cur_len = 1
        res = 1
        for i in range(1, len(nums)):
            if nums[i] > nums[i-1]:
                cur_len += 1
            else:
                cur_len = 1
            res = max(res, cur_len)
        return res

到了這里,關(guān)于算法通關(guān)村第十六關(guān):青銅挑戰(zhàn)-滑動窗口其實很簡單的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • 算法通關(guān)村|青銅挑戰(zhàn)----鏈表

    前言:數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ):創(chuàng)建+增刪改查 學習目標:單鏈表的創(chuàng)建+增刪改查,雙鏈表的創(chuàng)建+增刪改查 數(shù)據(jù)域+指針域 數(shù)據(jù)域:當前節(jié)點的元素值 指針域:當前節(jié)點保存的下一個節(jié)點的元素的地址,其中最后一個元素的指針域指向null 標準的面向?qū)ο蟮墓?jié)點的定義: LeetCode中節(jié)

    2024年02月15日
    瀏覽(18)
  • [Go版]算法通關(guān)村第一關(guān)青銅——鏈表青銅挑戰(zhàn)筆記

    [Go版]算法通關(guān)村第一關(guān)青銅——鏈表青銅挑戰(zhàn)筆記

    單向鏈表圖示: 雙向鏈表圖示: 環(huán)形單向鏈表圖示: 環(huán)形雙向鏈表圖示: 源碼地址: GitHub-golang版本 如果是單向的,需要將當前節(jié)點 定位到要插入節(jié)點的前一個節(jié)點 ,否則一旦過了將無法回頭找到前一個節(jié)點 如果是雙向的,將當前節(jié)點 定位到要插入節(jié)點的前一個節(jié)點、

    2024年02月13日
    瀏覽(21)
  • 《算法通關(guān)村第一關(guān)——鏈表青銅挑戰(zhàn)筆記》

    《算法通關(guān)村第一關(guān)——鏈表青銅挑戰(zhàn)筆記》

    鏈表中每個結(jié)點內(nèi)部的“生態(tài)環(huán)境”。 數(shù)據(jù)域存儲元素的值,指針域存放指針。 示例: c語言構(gòu)造鏈表 可分為三步 1.創(chuàng)建頭指針。 2.創(chuàng)建頭結(jié)點,使頭指針指向頭結(jié)點。 3.循環(huán)創(chuàng)建結(jié)點,并使前一個結(jié)點指向當前結(jié)點。 1.)創(chuàng)建結(jié)點。 2.)使前一個結(jié)點指向當前結(jié)點。 3.)

    2024年02月15日
    瀏覽(27)
  • 算法通關(guān)村第一關(guān)-鏈表青銅挑戰(zhàn)筆記

    算法通關(guān)村第一關(guān)-鏈表青銅挑戰(zhàn)筆記

    平時我們一般都是用數(shù)組,每個數(shù)組都會有一個相對應的索引,這樣就使得數(shù)組能夠方便的調(diào)用出對應索引得到需要的數(shù)據(jù),但是這也造成了一個問題,那就是不好在數(shù)組中插入或者刪除一個數(shù)據(jù),例如 int arr[]={1,2,4,5}如果我想在數(shù)組中的2和4中添加一個數(shù)據(jù)3 那么我們首先就

    2024年02月15日
    瀏覽(25)
  • 算法通關(guān)村第一關(guān)--鏈表青銅挑戰(zhàn)筆記

    算法通關(guān)村第一關(guān)--鏈表青銅挑戰(zhàn)筆記

    開始時間:2023年7月16日20:45:26 什么是鏈表,鏈表是一種通過指針串聯(lián)在一起的線性結(jié)構(gòu),每一個節(jié)點由兩部分組成,一個是數(shù)據(jù)域一個是指針域(存放指向下一個節(jié)點的指針),最后一個節(jié)點的指針域指向null(空指針的意思)。 鏈表的入口節(jié)點稱為鏈表的頭結(jié)點也就是hea

    2024年02月17日
    瀏覽(29)
  • 算法通關(guān)村第一關(guān) | 鏈表青銅挑戰(zhàn)筆記

    算法通關(guān)村第一關(guān) | 鏈表青銅挑戰(zhàn)筆記

    一、 什么是鏈表? 鏈表是一種比較簡單、很常見的數(shù)據(jù)結(jié)構(gòu),是一種物理存儲單元上非連續(xù)、非順序的存儲結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的。 二、鏈表的特點 鏈表是一種比較簡單、很常見的數(shù)據(jù)結(jié)構(gòu),是線性表(List)的一種,是一種物理存

    2024年02月14日
    瀏覽(24)
  • 算法通關(guān)村第一關(guān)———鏈表青銅挑戰(zhàn)筆記

    算法通關(guān)村第一關(guān)———鏈表青銅挑戰(zhàn)筆記

    通過類來構(gòu)建節(jié)點,用next指針將節(jié)點連起來。 會有插入位置的范圍問題,不能超出鏈表范圍 會有刪除位置的范圍問題 構(gòu)造雙向鏈表 插入和刪除都有三種情況,頭中尾 ?

    2024年02月15日
    瀏覽(25)
  • 算法通關(guān)村第一關(guān)——鏈表青銅挑戰(zhàn)筆記

    算法通關(guān)村第一關(guān)——鏈表青銅挑戰(zhàn)筆記

    鏈表的基本單元就是 節(jié)點 ,也就是說鏈表是由一個一個節(jié)點構(gòu)成的。 而對于節(jié)點來說,里面至少會包含一個 指針 和一個 數(shù)據(jù)元素 ,也就是如下圖所示: 其中數(shù)據(jù)域用來存放數(shù)據(jù)元素,指針域用來存放指向下一個節(jié)點的指針,這樣一個一個連接起來的就是鏈表。如下圖所

    2024年02月16日
    瀏覽(27)
  • 算法通關(guān)村第一關(guān)——鏈表青銅挑戰(zhàn)筆記(單鏈表)

    在LeeCode中一般這樣創(chuàng)建鏈表 要注意創(chuàng)建一個變量來遍歷,不要把head丟掉了 count position - 1可以方便操作,還能防止下標越界(cur為null)

    2024年02月15日
    瀏覽(21)
  • 【無標題】算法通關(guān)村第一關(guān)——鏈表青銅挑戰(zhàn)筆記

    【無標題】算法通關(guān)村第一關(guān)——鏈表青銅挑戰(zhàn)筆記

    算法通關(guān)村第一關(guān)——鏈表青銅挑戰(zhàn)筆記 C語言是如何構(gòu)造出鏈表的 0.定義節(jié)點結(jié)構(gòu) 1.建立頭指針 2.建立temp指針 3.將節(jié)點連起來 3.1 把p指向temp 3.2 設立循環(huán)節(jié)點a+temp指向a+temp變?yōu)閍

    2024年02月15日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包