leetcode327 區間和的個數

2021-10-01 02:34:59 字數 1277 閱讀 5118

給定乙個整數陣列 nums,返回區間和在 [lower, upper] 之間的個數,包含 lower 和 upper。

區間和 s(i, j) 表示在 nums 中,位置從 i 到 j 的元素之和,包含 i 和 j (i ≤ j)。

說明:最直觀的演算法複雜度是 o(n2) ,請在此基礎上優化你的演算法。

示例:輸入: nums = [-2,5,-1], lower = -2, upper = 2,

輸出: 3 

解釋: 3個區間分別是: [0,0], [2,2], [0,2],它們表示的和分別為: -2, -1, 2。

計算累積和陣列 sums 的,其中 sum[i] = nums[0] + nums[1] + ... + nums[i],對於某個i來說,只有那些滿足 lower <= sum[j] - sum[i] <= upper 的 j 能形成乙個區間 [i, j] 滿足題意,則有:sum[i] + lower =< sum[j] <= sum[i] + upper,目標就是來找到有多少個這樣的 j滿足上述條件。從後向前遍歷累加和陣列,相當於固定sum[i]後,算出有多少的sum[j]滿足左右條件。因為必須滿足0 =< i <= j,所以sum[j]的範圍一定是由sum[i]之後的元素組成的陣列。對sum[j]的範圍陣列排序,l是找陣列中第乙個大於等於給定值(左條件)的數,而 r 是找陣列中最後乙個小於等於給定值(右條件)的數,那麼兩者相減,就是j的個數。

class solution:

def countrangesum(self, nums: list[int], lower: int, upper: int) -> int:

p = [0]

for i in nums:

p += [p[-1] + i]

print (p)

ans = 0

q =

for pi in p[:]:

i, j = pi + lower, pi + upper

l = bisect.bisect_left(q, i)

r = bisect.bisect_right(q, j)

ans += r - l

bisect.insort(q, pi)

return ans

leetCode 327 區間和的個數

給定乙個整數陣列nums,返回區間和在 lower,upper 之間的個數,包含lower和upper。區間和s i,j 表示在nums中,位置從i到j的元素之和,包含i和j i j 說明 最直觀的演算法複雜度是o n 2 請在此基礎上優化你的演算法。示例 輸入 nums 2,5,1 lower 2...

leetcode 327 區間和的個數 C語言

演算法思想 使用歸併排序的演算法思想 1.使用sums i 陣列放0 i 1的累加和,sums 0 0 2.對於任意的i j,lower sums i sums j upper滿足條件,則為一種可能的序列區間 3.對於有序的陣列,取符合條件的返回,可使用雙指標的方法。void print long ...

LeetCode 327 區間和的個數 歸併排序

求區間和,一般先構建字首和陣列進行資料預處理,可以 o 1 得到任意區間和。查詢元素,一般先進行排序,利用單調性可以快速的縮減查詢範圍,減少時間複雜度。歸併排序包含了兩個過程 從上往下的分解 把當前區間一分為二,直至分解為若干個長度為1的子陣列 從下往上的合併 兩個有序的子區域兩兩向上合併。對於本題...