Skip to content

Commit 4b8ad97

Browse files
committed
1589. Maximum Sum Obtained of Any Permutation: AC
1 parent e7a71f2 commit 4b8ad97

File tree

2 files changed

+120
-0
lines changed

2 files changed

+120
-0
lines changed

src/solution/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1197,3 +1197,4 @@ mod s1583_count_unhappy_friends;
11971197
mod s1584_min_cost_to_connect_all_points;
11981198
mod s1585_check_if_string_is_transformable_with_substring_sort_operations;
11991199
mod s1588_sum_of_all_odd_length_subarrays;
1200+
mod s1589_maximum_sum_obtained_of_any_permutation;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
/**
2+
* [1589] Maximum Sum Obtained of Any Permutation
3+
*
4+
* We have an array of integers, nums, and an array of requests where requests[i] = [starti, endi]. The i^th request asks for the sum of nums[starti] + nums[starti + 1] + ... + nums[endi - 1] + nums[endi]. Both starti and endi are 0-indexed.
5+
* Return the maximum total sum of all requests among all permutations of nums.
6+
* Since the answer may be too large, return it modulo 10^9 + 7.
7+
*
8+
* Example 1:
9+
*
10+
* Input: nums = [1,2,3,4,5], requests = [[1,3],[0,1]]
11+
* Output: 19
12+
* Explanation: One permutation of nums is [2,1,3,4,5] with the following result:
13+
* requests[0] -> nums[1] + nums[2] + nums[3] = 1 + 3 + 4 = 8
14+
* requests[1] -> nums[0] + nums[1] = 2 + 1 = 3
15+
* Total sum: 8 + 3 = 11.
16+
* A permutation with a higher total sum is [3,5,4,2,1] with the following result:
17+
* requests[0] -> nums[1] + nums[2] + nums[3] = 5 + 4 + 2 = 11
18+
* requests[1] -> nums[0] + nums[1] = 3 + 5 = 8
19+
* Total sum: 11 + 8 = 19, which is the best that you can do.
20+
*
21+
* Example 2:
22+
*
23+
* Input: nums = [1,2,3,4,5,6], requests = [[0,1]]
24+
* Output: 11
25+
* Explanation: A permutation with the max total sum is [6,5,4,3,2,1] with request sums [11].
26+
* Example 3:
27+
*
28+
* Input: nums = [1,2,3,4,5,10], requests = [[0,2],[1,3],[1,1]]
29+
* Output: 47
30+
* Explanation: A permutation with the max total sum is [4,10,5,3,2,1] with request sums [19,18,10].
31+
*
32+
* Constraints:
33+
*
34+
* n == nums.length
35+
* 1 <= n <= 10^5
36+
* 0 <= nums[i] <= 10^5
37+
* 1 <= requests.length <= 10^5
38+
* requests[i].length == 2
39+
* 0 <= starti <= endi < n
40+
*
41+
*/
42+
pub struct Solution {}
43+
44+
// problem: https://leetcode.com/problems/maximum-sum-obtained-of-any-permutation/
45+
// discuss: https://leetcode.com/problems/maximum-sum-obtained-of-any-permutation/discuss/?currentPage=1&orderBy=most_votes&query=
46+
47+
// submission codes start here
48+
49+
const MOD: usize = 1_000_000_007;
50+
51+
impl Solution {
52+
pub fn max_sum_range_query(nums: Vec<i32>, requests: Vec<Vec<i32>>) -> i32 {
53+
let n = nums.len();
54+
let mut memo = vec![(0, 0); n];
55+
56+
for arr in requests {
57+
memo[arr[0] as usize].0 += 1;
58+
memo[arr[1] as usize].1 += 1;
59+
}
60+
61+
let mut counts = vec![0; n];
62+
let mut temp = 0;
63+
for i in 0..n {
64+
temp += memo[i].0;
65+
counts[i] = temp;
66+
temp -= memo[i].1;
67+
}
68+
69+
counts.sort_unstable();
70+
let mut nums = nums;
71+
nums.sort_unstable();
72+
73+
let mut result = 0;
74+
75+
for i in 0..n {
76+
result += counts[i] as usize * nums[i] as usize % MOD;
77+
result %= MOD;
78+
}
79+
80+
result as i32
81+
}
82+
}
83+
84+
// submission codes end
85+
86+
#[cfg(test)]
87+
mod tests {
88+
use super::*;
89+
90+
#[test]
91+
fn test_1589_example_1() {
92+
let nums = vec![1, 2, 3, 4, 5];
93+
let requests = vec![vec![1, 3], vec![0, 1]];
94+
95+
let result = 19;
96+
97+
assert_eq!(Solution::max_sum_range_query(nums, requests), result);
98+
}
99+
100+
#[test]
101+
fn test_1589_example_2() {
102+
let nums = vec![1, 2, 3, 4, 5, 6];
103+
let requests = vec![vec![0, 1]];
104+
105+
let result = 11;
106+
107+
assert_eq!(Solution::max_sum_range_query(nums, requests), result);
108+
}
109+
110+
#[test]
111+
fn test_1589_example_3() {
112+
let nums = vec![1, 2, 3, 4, 5, 10];
113+
let requests = vec![vec![0, 2], vec![1, 3], vec![1, 1]];
114+
115+
let result = 47;
116+
117+
assert_eq!(Solution::max_sum_range_query(nums, requests), result);
118+
}
119+
}

0 commit comments

Comments
 (0)