leetcode1589 所有排列中的最大和

2021-10-10 07:54:42 字數 1602 閱讀 3894

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

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

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

輸入: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,這個方案是所有排列中查詢之和最大的結果。

這個題的基本思路很簡單,哪個位置i被查詢的次數最多,就把nums中最大的數字放在該位置上,後面的同理。

也就是:統計每個位置的被查詢次數,按查詢次數排列從大到小排列,同時將nums從大到小排列,依次乘起來即可;

class

solution

}for

(int i =

1; i < length;

++i)

// 為了方便理解,這裡拆開寫了,可以直接在startend上+的;

// helper[i]表示在i位置,被requerts中的區間的覆蓋次數

// 如果i-1位置被覆蓋了x次,且以i位置開始的區間有y個,以i-1位置結束的區間有z個

// 很明顯i位置被覆蓋了x+(y-z)次(後面的括號就是startend[i]中的結果)

for(

int i =

1; i < length;

++i)

// 排序,重複次數越多的位置,放置的數字越大,這樣可以使總和最大

sort

(nums.

begin()

, nums.

end())

;sort

(startend.

begin()

, startend.

end())

;long

long ans =0;

for(

int i =

0; i < length;

++i)

return ans %

1000000007;}

};

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 5505 所有排列中的最大和

目錄 一 題目內容 二 解題思路 三 有乙個整數陣列 nums 和乙個查詢陣列 requests 其中 requests i starti,endi 第 i 個查詢求 nums starti nums starti 1 nums endi 1 nums endi 的結果 starti 和 endi ...