Leetcode 所有排列中的最大和

2021-10-09 14:51:22 字數 1988 閱讀 6339

第35場雙周賽第二題:

有乙個整數陣列nums,和乙個查詢陣列requests,其中requests[i] = [starti, endi]。第i個查詢求nums[starti] + nums[starti + 1] + ... + nums[endi - 1] + nums[endi]的結果 ,startiendi陣列索引都是 從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。看似簡單,其實不是很好做,應該把問題分解為子問題,我們把字串看成兩個部分,首字母自己作為一部分,後面的其他節點當做其它部分。可以看成兩部走 求出所有課...