Python程序:查找任意排列的最大和
假设我们有一个数组nums,还有一个名为requests的数组,其中requests[i] = [start_i, end_i],这表示第i个请求要求nums[start_i] + nums[start_i+1] + ... + nums[end_i-1] + nums[end_i]的和。我们必须找到所有nums排列中所有请求的最大总和。答案可能非常大,因此返回它模10^9+7。
因此,如果输入类似于nums = [10,20,30,40,50] requests = [[1,3],[0,1]],则输出将为190,因为如果我们像[30,50,40,20,10]那样排列,我们得到:来自requests[0]:nums[1] + nums[2] + nums[3] = 50 + 40 + 20 = 110,以及来自requests[1]:nums[0] + nums[1] = 30 + 50 = 80,因此总和为110+80 = 190。
为了解决这个问题,我们将遵循以下步骤
- A := 一个新的列表
- 对于requests中的每个请求(s, e),执行:
- 在A的末尾插入对(s, 0)
- 在A的末尾插入对(e, 1)
- 对列表A进行排序
- fr := 一个空映射
- cnt := 0
- n := A的大小
- i := 0
- 当i < n时,执行:
- r := 1
- 当i < n - 1且A[i+1]与A[i]相同时,执行:
- r := r + 1
- i := i + 1
- cnt := cnt + r
- 如果cnt - r > 0,则
- 在fr[cnt-r]的末尾插入(pre, p-1)
- pre := p
- 在fr[cnt-r]的末尾插入(pre, p-1)
- 否则,当flag与1相同时,则
- cnt := cnt - r
- 在fr[cnt+r]的末尾插入(pre, p)
- pre := p+1
- i := i + 1
- 反向排序列表nums
- ks := 从fr的所有键的列表中创建一个新列表
- 反向排序列表ks
- ans := 0
- m := 10^9 + 7
- i := 0
- 对于ks中的每个k,执行:
- 对于fr[k]中的每个对(s, e),执行:
- d := e - s + 1
- ans := ans + (nums[从索引i到i+d-1]的所有元素的和) * k
- ans := ans mod m
- i := i + d
- 对于fr[k]中的每个对(s, e),执行:
- 返回ans
示例
让我们看看下面的实现,以便更好地理解:
from collections import defaultdict def solve(nums, requests): A = [] for s, e in requests: A.append((s, 0)) A.append((e, 1)) A.sort() fr = defaultdict(list) cnt = 0 n = len(A) i = 0 while i < n: r = 1 while i < n - 1 and A[i+1] == A[i]: r += 1 i += 1 p, flag = A[i] if flag == 0: cnt += r if cnt - r > 0: fr[cnt-r].append((pre, p-1)) pre = p elif flag == 1: cnt -= r fr[cnt+r].append((pre, p)) pre = p+1 i += 1 nums.sort(reverse=True) ks = list(fr.keys()) ks.sort(reverse=True) ans = 0 m = 10**9 + 7 i = 0 for k in ks: for s, e in fr[k]: d = e - s + 1 ans += sum(nums[i:i+d]) * k ans %= m i += d return ans nums = [10,20,30,40,50] requests = [[1,3],[0,1]] print(solve(nums, requests))
输入
[10,20,30,40,50],[[1,3],[0,1]]
输出
190
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP