1508 子陣列和排序後的區間和

2021-10-24 12:08:29 字數 1641 閱讀 6008

給你乙個陣列 nums ,它包含 n 個正整數。你需要計算所有非空連續子陣列的和,並將它們按公升序排序,得到乙個新的包含 n * (n + 1) / 2 個數字的陣列。

請你返回在新陣列中下標為 left 到 right (下標從 1 開始)的所有數字和(包括左右端點)。由於答案可能很大,請你將它對 10^9 + 7 取模後返回。

示例 1:

輸入:nums = [1,2,3,4], n = 4, left = 1, right = 5

輸出:13

解釋:所有的子陣列和為 1, 3, 6, 10, 2, 5, 9, 3, 7, 4 。將它們公升序排序後,我們得到新的陣列 [1, 2, 3, 3, 4, 5, 6, 7, 9, 10] 。下標從 le = 1 到 ri = 5 的和為 1 + 2 + 3 + 3 + 4 = 13 。

示例 2:

輸入:nums = [1,2,3,4], n = 4, left = 3, right = 4

輸出:6

解釋:給定陣列與示例 1 一樣,所以新陣列為 [1, 2, 3, 3, 4, 5, 6, 7, 9, 10] 。下標從 le = 3 到 ri = 4 的和為 3 + 3 = 6 。

示例 3:

輸入:nums = [1,2,3,4], n = 4, left = 1, right = 10

輸出:50

1 <= nums.length <= 10^3

nums.length == n

1 <= nums[i] <= 100

1 <= left <= right <= n * (n + 1) / 2

class

solution

:"""

解題思路

很明顯的字首和思路,做過此型別題的應該不難。

先用一次遍歷生成字首和列表,再用一次雙層迴圈求每乙個非空連續子陣列的和,排序,求和即可。

"""defrangesum

(self, nums: list[

int]

, n:

int, left:

int, right:

int)

->

int:

prefix_and =

pre_and =

0for num in nums:

pre_and += num

# 生成第乙個元素的字首和

# 根據第乙個元素的字首和,計算出其它元素的字首和

subarray_and =

subarray_and = prefix_and.copy(

)for i in

range(0

,len

(prefix_and)):

for j in

range

(i+1

,len

(prefix_and)):

- prefix_and[i]

) subarray_and.sort(

)return

sum(subarray_and[left-

1:right]

)

陣列中最長的區間,滿足該區間內的數排序後是連續的。

陣列中最長的區間,滿足該區間內的數排序後是連續的。比如,23,4,1,3,2,9,8,24 4,1,3,2 是最長區間,是連在一起的。23,1,3,2,9,4,8,24 就只能返回1,2,3了。這裡考慮到陣列沒有重複的,如果數有重複的話,目前還沒有想到好的方法。應該有更好的演算法,救大神指教 從x0...

最小和子陣列

給定乙個整數陣列,找到乙個具有最小和的子陣列。返回其最小和。注意事項 子陣列最少包含乙個數字 您在真實的面試中是否遇到過這個題?yes 樣例給出陣列 1,1,2,1 返回 3 解法1 class solution int cur sum 0 int max sum 0 int min sum int...

模板 樹狀陣列的區間加值和區間查詢

樹狀陣列可以實現單點修改區間查詢,或是差分的區間修改單點查詢。點這裡 那麼樹狀陣列能不能實現區間加值區間查詢呢?原始序列為a。我們先考慮區間加值,用差分的方式維護乙個d陣列,d x 表示的是 x,maxn 每個數的增量。那麼如果需要查詢1 x的字首和,需要查的是 su mx s igma ai d1...