第35場雙周賽第二題:
有乙個整數陣列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]。
首先最容易想到暴力法,但是超時了。
public
static
intmaxsumrangequery
(int
nums,
int[
] requests)
} arrays.
sort
(map)
;int sum =0;
for(
int i = map.length -
1; i >=
0; i--
)return sum;
}
更好的解法是差分:
public
static
intmaxsumrangequery
(int
nums,
int[
] requests)
// 從差分陣列反推目標陣列
for(
int i =
1; i < n; i++
)// 對兩個陣列公升序排序
arrays.
sort
(nums)
; arrays.
sort
(c);
int sum =0;
// 由於公升序排序,最大值在最後,所以從後往前遍歷,可以在任意乙個數等於0時快速跳出迴圈
for(
int i = n -
1; i >=
0; i--
)return sum;
}
leetcode 5505 所有排列中的最大和
目錄 一 題目內容 二 解題思路 三 有乙個整數陣列 nums 和乙個查詢陣列 requests 其中 requests i starti,endi 第 i 個查詢求 nums starti nums starti 1 nums endi 1 nums endi 的結果 starti 和 endi ...
leetcode1589 所有排列中的最大和
有乙個整數陣列 nums 和乙個查詢陣列 requests 其中 requests i starti,endi 第 i 個查詢求 nums starti nums starti 1 nums endi 1 nums endi 的結果 starti 和 endi 陣列索引都是 從 0 開始 的。你可以...
字串的所有排列
輸入乙個字串,列印出該字串的所有排列,例如輸入字串abc 則列印出a,b,c 所能排列出來的所有字串 abc,acd,bac,bca,cab,cba。看似簡單,其實不是很好做,應該把問題分解為子問題,我們把字串看成兩個部分,首字母自己作為一部分,後面的其他節點當做其它部分。可以看成兩部走 求出所有課...