有乙個整數陣列 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 ...