1438. 絕對差不超過限制的最長連續子數組

2021-02-26 深度思考plus

題目URL:https://leetcode-cn.com/problems/longest-continuous-subarray-with-absolute-diff-less-than-or-equal-to-limit/

題目要求:

思路:因為在連續區間內任意兩個數的差值都要≤ limit,所以 max-min ≤ limit.在一個數組中找滿足該要求的最長連續子數組。可以考慮使用滑動窗口。(滑動窗口在左端固定前提下,右端找到的最長子數組就是題目所求子數組已經被證明過兩次了)

滑動窗口初始 left,right = 0,0

當滑動窗口內,出現了max-min > limit,就是固定右指針。然後不停移動左指針,指到窗口滿足 max-min ≤ limit

right +=1

求區間的最小值,①python中時調用sortedcontainer三方包,利用SortedList來解決。②本地可以使用單調隊列(不能使用單調棧:無法知道各個元素的位置,導致移動左指針時,不能移動左指針索引位的元素)

代碼如下:

class Solution(object):  

    def longestSubarray(self, nums, limit):  

        """  

        :type nums: List[int]  

        :type limit: int  

        :rtype: int  

        """  

  

        max_len = 0  

        n = len(nums)  

  

        for i in range(n):  

            for j in range(i, n):  

                if abs(nums[i] - nums[j]) > limit:  

                    break  

                max_len = max(max_len, j - i + 1)  

        return max_len  

  

#創建兩個堆:一個大,一個小。利用max-min + 滑動窗口  

import collections  

class Solution:  

    def longestSubarray(self, nums, limit: int) -> int:  

        max_que, min_que = collections.deque(), collections.deque()  

        right,left = 0,0  

        n = len(nums)  

        max_len = 0  

        while right < n:  

            #創建單調隊列  

            while max_que and max_que[-1] < nums[right]:  

                max_que.pop()  

            while min_que and min_que[-1] > nums[right]:  

                min_que.pop()  

  

  

            max_que.append(nums[right])  

            min_que.append(nums[right])  

  

            while max_que and min_que and abs(max_que[0] - min_que[0]) > limit:  

                if max_que[0] == nums[left]:  

                    max_que.popleft()  

                if min_que[0] == nums[left]:  

                    min_que.popleft()  

  

                left += 1  

  

            max_len = max(max_len, right - left + 1)  

            right += 1  

        return max_len  

  

if __name__ == '__main__':  

    nums = [8, 2, 4, 7]  

    limit = 4  

    nums = [10, 1, 2, 4, 7, 2]  

    limit = 5  

    nums = [4, 2, 2, 2, 4, 4, 2, 2]  

    limit = 0  

    nums = [2,2,5,2,1,3,2,2,2]  

    limit = 2  

  

    print(Solution().longestSubarray(nums, limit))  

相關焦點

  • LeetCode 例題精講 | 16 最大子數組和:子數組類問題的動態規劃技巧
    今天要講的是關於「子數組」類題目的常見技巧。在講具體問題之前,我們要明確一下「子數組」和「子序列」的概念。子序列 (subsequence) 可以是不連續的。例如 "ACD" 是 "ABCDE" 的子序列;子數組 (subarray)、子串 (substring) 必須是連續的。
  • LeetCode:連續子數組的最大和
    輸入一個整型數組,數組中的一個或連續多個整數組成一個子數組。求所有子數組的和的最大值。
  • LeetCode 47.674.最長連續遞增序列
    描述給定一個未經排序的整數數組,找到最長且連續的的遞增序列,並返回該序列的長度。
  • 詳解連續子數組的最大累乘之動態規劃解法
    這個題目,當然可以用窮舉所有子數組的方法,找出最大值,時間複雜度妥妥地為O(n^2),這顯然不是我們想要的。如何用DP降低到O(n)才是我們的目標,這才是算法的魅力所在,接下來,總結DP求解的思維過程。
  • 給定一個int 數組,給出其中連續子序列的最大和(高頻面試題系列)
    題目:輸入一個整型數組,數組裡有正數也有負數。數組中一個或連續的多個整數組成一個子數組。求所有子數組的和的最大值。
  • 「LeetCode算法精講」數組中的最短無序連續子數組(Python)
    題目內容給定一個整數數組,你需要尋找一個連續的子數組,如果對這個子數組進行升序排序,那麼整個數組都會變為升序排序。你找到的子數組應是最短的,請輸出它的長度。說明:輸入的數組長度範圍在 [1, 10,000]。輸入的數組可能包含重複元素 ,所以升序的意思是<=。
  • 筆試 | 字節跳動 最優連續子序列
    字節跳動08.09筆試:最優連續子序列給定一個長度為n的整數序列,使得該段連續子序列的交替和最大。給定一個長度為n的整數序列,找出其中一段連續子序列,使得該段連續子序列的和最大。這是一道經典的動態規劃-「最大子段和問題」。
  • LeetCode數組類知識點&題型總結
    順序存儲就是把數據存儲在一塊連續的空間內。數組(array)就是典型的順序存儲,而鍊表就是典型的非順序存儲。數組通常用於存儲一系列相同類型的數據。當我們在創建數組時,會在內存中劃分出一塊連續的內存用於存儲數據,插入數據時,會將數據按順序存儲在這塊連續的內存中,讀取時通過訪問數組的索引迅速取出。數組名就是一個指針,指向這段內存的起始地址。
  • MATLAB數組的常用函數
    這些函數在MATLAB中可以同時作用於整個矩陣或者數組,應用起來非常方便,不需要再另寫循環程序來對各元素分別進行計算。掌握這些函數是進一步學習的基礎。MATLAB人性化的地方在於其自帶函數基本是按照相對應的英文名稱縮寫而來,所以便於記憶。
  • 如何使用Numpy數組?
    【連續「Python利用Numpy數組進行數據處理(一)」】2.【聚合函數】數學和統計方法[軸和0]可以通過數組上的一組數學函數對整個數組或某個軸向的數組進行統計計算。>說明sum對數組中全部或某軸向的元素求和。
  • 在VBA中如何使用動態數組,以及利用動態數組去除重複值的方法
    一 :Filter函數:這個函數返回一個下標從零開始的數組,該數組包含基於指定篩選條件的一個字符串數組的子集,語法如下:Filter(sourcesrray, match[, include[, compare]])參數a) sourcesrray是必須的,要執行搜索的一維字符串數組。b) match是必須的,要搜索的字符串。
  • LeetCode刷題第三周【數組(簡單)】
    數組是目前Leetcode上題量最多的一個模塊了。刷題前我們來了解一下什麼是數組:數組是在程序設計中,為了處理方便, 把具有相同類型的若干元素按有序的形式組織起來的一種形式。首先,數組會利用 索引 來記錄每個元素在數組中的位置,且在大多數程式語言中,索引是從 0 算起的。我們可以根據數組中的索引,快速訪問數組中的元素。事實上,這裡的索引其實就是內存地址。
  • LeetCode刷題指南(數組和矩陣)
    for (int j = 0; j < c; j++) {            reshapedNums[i][j] = nums[index / n][index % n];            index++;        }    }    return reshapedNums;}找出數組中最長的連續
  • 世界最長的河流「截斷」,中國火了。美日:這絕對是不可能的
    世界上最長的河流被「截斷」,中國再次著火。美國和日本:這絕對是不可能的。從全世界的角度來看,蘇丹是一個非常不發達國家。他們的內部經濟落後,居民的日常供電成為一個問題。為了解決該國的用電問題,使人們可以用家挨戶用電,他們決定實施一個巨大的項目。該項目是利用尼羅河在境內的流動來建造一個巨大的電站。
  • Python入門教程(二):Numpy數組基礎
    Python中的數組操作幾乎等同於Numpy數組操作,今天我們會展示用Numpy數組操作獲取數據或者子數組,對數組進行分裂,變形和連接的例子。首先,我們先介紹幾類基本的數組操作:數組的屬性確定數組的大小,形狀,儲存大小,數據類型數組的索引:獲取和設置各個元素的值數組的切分:在大的數組中獲取或設置更小的子數組
  • Java基礎篇——數組詳解
    Java語言提供了數組(array)的數據結構,可以解決這個問題。數組的概念一個數組是相同數據類型的元素按一定順序排列的集合。使用數組可以將同一類型的數據存儲在連續的內存位置。數組中各元素的類型相同,通過下標的方式來訪問數組中的元素,下標從0開始。
  • 單片機的C語言中數組的用法
    數組是由具有相同類型的數據元素組成的有序集合。數組是由數組名來表示的,數組中的數據由特定的下標來唯一確定。引入數組的目的,是使用一塊連續的內存空間存儲多個類型相同的數據,以解決一批相關數據的存儲問題。數組與普通變量一樣,也必須先定義,後使用。數組在C51語言的地位舉足輕重,因此深入地了解數組是很有必要的。