leetcode 5505 所有排列中的最大和

2021-10-09 14:59:44 字數 2355 閱讀 1493

目錄

一、題目內容

二、解題思路

三、**

有乙個整數陣列 nums ,和乙個查詢陣列 requests ,其中 requests[i] = [starti, endi] 。第 i 個查詢求 nums[starti] + nums[starti + 1] + ... + nums[endi - 1] + nums[endi] 的結果 ,starti 和 endi 陣列索引都是 從 0 開始 的。

你可以任意排列 nums 中的數字,請你返回所有查詢結果之和的最大值。

由於答案可能會很大,請你將它對 10^9 + 7 取餘 後返回。

示例 1:

輸入:nums = [1,2,3,4,5], requests = [[1,3],[0,1]]

輸出:19

解釋:乙個可行的 nums 排列為 [2,1,3,4,5],並有如下結果:

requests[0] -> nums[1] + nums[2] + nums[3] = 1 + 3 + 4 = 8

requests[1] -> nums[0] + nums[1] = 2 + 1 = 3

總和為:8 + 3 = 11。

乙個總和更大的排列為 [3,5,4,2,1],並有如下結果:

requests[0] -> nums[1] + nums[2] + nums[3] = 5 + 4 + 2 = 11

requests[1] -> nums[0] + nums[1] = 3 + 5  = 8

總和為: 11 + 8 = 19,這個方案是所有排列中查詢之和最大的結果。

示例 2:

輸入:nums = [1,2,3,4,5,6], requests = [[0,1]]

輸出:11

解釋:乙個總和最大的排列為 [6,5,4,3,2,1] ,查詢和為 [11]。

示例 3:

輸入:nums = [1,2,3,4,5,10], requests = [[0,2],[1,3],[1,1]]

輸出:47

解釋:乙個和最大的排列為 [4,10,5,3,2,1] ,查詢結果分別為 [19,18,10]。

n == nums.length

1 <= n <= 105

0 <= nums[i] <= 105

1 <= requests.length <= 105

requests[i].length == 2

0 <= starti <= endi < n

1.記錄requests中範圍內數字的使用次數,存入diff中。

2.注意儲存次數的方式不能暴力的雙重for,否則導致超時。

3.利用射線傳遞和截斷的思想,每次都將自己是否作為起點或終點的數量與前乙個數字在

requests

中各個範圍中

包含個數相加,得到自己的使用次數。

class solution:

def maxsumrangequery(self, nums: list, requests: list) -> int:

n = len(nums)

diff = [0] * n

for s, e in requests:

diff[s] += 1

if e + 1 < n:

diff[e + 1] -= 1

for i in range(1, n):

diff[i] += diff[i - 1]

nums.sort()

diff.sort()

ans = 0

for i in range(n):

ans += nums[i] * diff[i]

return ans % (10 ** 9 + 7)

if __name__ == '__main__':

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

requests = [[1, 3], [0, 1]]

s = solution()

ans = s.maxsumrangequery(nums, requests)

print(ans)

988 211所有學校

console 命令列 function removetablerow rowlist,rownum var ptn211 new regexp 清華大學 北京大學 中國人民大學 北京工業大學 北京理工大學 北京航空航天大學 北京化工大學 北京郵電大學 對外經濟 大學 中國傳媒大學 民族大學 中國礦...

Leetcode 797 所有可能的路徑 C

給乙個有 n 個結點的有向無環圖,找到所有從 0 到 n 1 的路徑並輸出 不要求按順序 輸入 1,2 3 3 輸出 0,1,3 0,2,3 解釋 圖是這樣的 0 1 v v 2 3 這有兩條路 0 1 3 和 0 2 3.dfs深搜回溯,從節點0開始遍歷,終點為n 1。詳細過程見 vectorin...

LeetCode 1588 所有奇數長度子陣列的和

給你乙個正整數陣列 arr 請你計算所有可能的奇數長度子陣列的和。子陣列 定義為原陣列中的乙個連續子串行。請你返回 arr 中 所有奇數長度子陣列的和 輸入 arr 1,4,2,5,3 輸出 58 解釋 所有奇數長度子陣列和它們的和為 1 1 4 4 2 2 5 5 3 3 1,4,2 7 4,2,...