2023-04-29:一个序列的 宽度 定义为该序列中最大元素和最小元素的差值。

给你一个整数数组 nums ,返回 nums 的所有非空 子序列 的 宽度之和

由于答案可能非常大,请返回对 109 + 7 取余 后的结果。

子序列 定义为从一个数组里删除一些(或者不删除)元素,

但不改变剩下元素的顺序得到的数组

例如,[3,6,2,7] 就是数组 [0,3,1,6,2,2,7] 的一个子序列。

输入:nums = [2,1,3]。

输出:6。

答案2023-04-29:

解题思路:

  1. 排序

首先对数组进行排序,这样我们就可以根据每个子序列的首尾元素来计算它的宽度了。

  1. 计算宽度

我们使用 A 表示当前子序列的宽度,即末尾元素与首元素的差值,使用 B 表示上一个子序列的宽度,即前一次循环中的 A 值。具体计算过程如下:

A = (D * nums[i]) % mod
B = ((B * 2) % mod + nums[i - 1]) % mod
ans = (ans + A - B + mod) % mod
C = (C * 2) % mod
D = (D + C) % mod

其中 D 和 C 分别表示当前子序列的长度和可能的贡献值,计算方法如下:

C = (C * 2) % mod
D = (D + C) % mod
  1. 取模

由于答案非常大,需要对其进行 10^9+7 取模,即将 ans 的值对 mod 取余。

时间复杂度:

排序的时间复杂度为 O(nlogn),计算宽度的时间复杂度为 O(n),因此总的时间复杂度为 O(nlogn)。

空间复杂度:

除了输入数据外,算法使用了常数级别的额外空间,因此空间复杂度为 O(1)。

go完整代码如下:

package main

import (
"fmt"
"sort"
) func sumSubseqWidths(nums []int) int {
sort.Ints(nums)
mod := 1000000007
ans := 0
var A, B, C, D int64 = 0, 0, 1, 1
for i := 1; i < len(nums); i++ {
A = (D * int64(nums[i])) % int64(mod)
B = ((B*2)%int64(mod) + int64(nums[i-1])) % int64(mod)
ans = (ans + int(A-B+int64(mod))) % int(mod)
C = (C * 2) % int64(mod)
D = (D + C) % int64(mod)
}
return ans
} func main() {
nums := []int{2, 1, 3}
result := sumSubseqWidths(nums)
fmt.Println(result)
}

rust完整代码如下:

fn sum_subseq_widths(nums: Vec<i32>) -> i32 {
let mut nums = nums.clone();
nums.sort_unstable();
let mod_num = 1000000007;
let mut ans = 0;
let mut a = 0;
let mut b = 0;
let mut c = 1;
let mut d = 1;
for i in 1..nums.len() {
a = (d * nums[i] as i64) % mod_num;
b = ((b * 2) % mod_num + nums[i - 1] as i64) % mod_num;
ans = (ans + a - b + mod_num) % mod_num;
c = (c * 2) % mod_num;
d = (d + c) % mod_num;
}
ans as i32
} fn main() {
let nums = vec![2, 1, 3];
let result = sum_subseq_widths(nums);
println!("{}", result);
}

c完整代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h> #define MOD 1000000007 int compare(const void* a, const void* b) {
return *(int*)a - *(int*)b;
} int sumSubseqWidths(int* nums, int numsSize) {
qsort(nums, numsSize, sizeof(int), compare);
long ans = 0, A = 0, B = 0, C = 1, D = C;
for (int i = 1; i < numsSize; i++) {
A = (D * nums[i]) % MOD;
B = ((B * 2) % MOD + nums[i - 1]) % MOD;
ans = (ans + A - B + MOD) % MOD;
C = (C * 2) % MOD;
D = (D + C) % MOD;
}
return (int)ans;
} int main() {
int nums[] = { 2, 1, 3 };
int numsSize = sizeof(nums) / sizeof(nums[0]);
int result = sumSubseqWidths(nums, numsSize);
printf("%d\n", result);
return 0;
}

c++完整代码如下:

#include <iostream>
#include <vector>
#include <algorithm> using namespace std; int sumSubseqWidths(vector<int>& nums) {
sort(nums.begin(), nums.end());
const int mod = 1000000007;
long ans = 0, A = 0, B = 0, C = 1, D = C;
for (int i = 1; i < nums.size(); i++) {
A = (D * nums[i]) % mod;
B = ((B * 2) % mod + nums[i - 1]) % mod;
ans = (ans + A - B + mod) % mod;
C = (C * 2) % mod;
D = (D + C) % mod;
}
return static_cast<int>(ans);
} int main() {
vector<int> nums{ 2, 1, 3 };
int result = sumSubseqWidths(nums);
cout << result << endl; // 输出:6
return 0;
}

2023-04-29:一个序列的 宽度 定义为该序列中最大元素和最小元素的差值。 给你一个整数数组 nums ,返回 nums 的所有非空 子序列 的 宽度之和 由于答案可能非常大,请返回对 109的更多相关文章

  1. java——设计一个支持push,pop,top、在恒定时间内检索最小元素的栈。

    普通方法: 需要另外一个栈 用来存放每一时刻的min值 巧妙版: 只需要一个stack,stack中存的是与min的差值 但由于min是两个整数之间的差值,有可能会出现差值超过整数边界值的情况,因此要 ...

  2. 现在有一个城市销售经理,需要从公司出发,去拜访市内的商家,已知他的位置以及商家的位置,但是由于城市道路交通的原因,他只能在左右中选择一个方向,在上下中选择一个方向,现在问他有多少种方案到达商家地址。给定一个地图map及它的长宽n和m,其中1代表经理位置,2代表商家位置,-1代表不能经过的地区,0代表可以经过的地区,请返回方案数,保证一定存在合法路径。保证矩阵的长宽都小于等于10。

    include "stdafx.h" #include<iostream> #include<vector> #include<algorithm&g ...

  3. 【记录一个问题】铁威马NAS存储中的人人影视APP,其WEB服务占满一个CPU核

    终端登录后,top命令发现rrshareweb这个进程把单个CPU核占满了. 发现其实是人人影视的web服务,而这个服务里面我还根本未使用. 卸载这个app后正常.

  4. HDU 1025 Constructing Roads In JGShining's Kingdom[动态规划/nlogn求最长非递减子序列]

    Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65 ...

  5. ALTER SEQUENCE - 更改一个序列生成器的定义

    SYNOPSIS ALTER SEQUENCE name [ INCREMENT [ BY ] increment ] [ MINVALUE minvalue | NO MINVALUE ] [ MA ...

  6. LeetCode 周赛 342(2023/04/23)容斥原理、计数排序、滑动窗口、子数组 GCB

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 大家好,我是小彭. 前天刚举办 2023 年力扣杯个人 SOLO 赛,昨天周赛就出了一场 Easy - Ea ...

  7. ie10中元素超出父元素的宽度时不能自动隐藏

    (从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期2014-02-21) 今天遇到一个问题,ie10中元素超出父元素的宽度时不能自动隐藏,而其余浏览器却正常显示. 解决方法是,手动给其设 ...

  8. 我的第一个Python程序,定义主函数,eval、format函数详解,

    程序实例: #第一个py小程序 def main(): f = eval(input("输入一个数值:")) p=f*(5/9) print("现在的值为:{0:3.3f ...

  9. html中label宽度设置、非替换元素和替换元素

    <label ></label> 单独对label设置一个width:100px的属性石不起作用的,和float:left或者display:inline-block配合的话 ...

  10. [oracle] ORA-08002:序列XXXXXXX.CURRVAL尚未在此进程中定义

    出现 ORA-08002: 序列XXXXXXX.CURRVAL 尚未在此进程中定义. 导致原因:因为是首次查询序列的当前值,内存中之前并没有缓存序列的任何值,所以需要先查询 一下序列的下一个值(此时, ...

随机推荐

  1. 2020.11.24 javaScript匿名函数的使用

    参考链接:http://www.voidcn.com/article/p-ngxxuegm-bmv.html 匿名函数: 函数表达式中创建的函数叫做匿名函数,也就是没有函数名的函数. 自执行函数: 创 ...

  2. 7 Free Energies: 7.4 Umbrella Sampling Example

    7.4 Umbrella Sampling Example计算丙氨酸二肽 Phi/Psi 旋转的 PMF    http://ambermd.org/tutorials/advanced/tutori ...

  3. docker学习随笔

    总结自https://zhuanlan.zhihu.com/p/187505981 Linux内核提供了Namespace技术来隔离PID/IPC/网络资源等,还提供了Control Group(cg ...

  4. python 超时装饰器

    #************************************************************** 设置超时的装饰器 *************************** ...

  5. Neo4j学习(3)--JavaAPI

    Neo4j Java操作 1. Neo4j Java Driver方式操作 使用该方式对数据进行操作时,必须先将Neo4j的服务启动起来. 从官方下载neo4j的Java驱动:https://neo4 ...

  6. vulhub的搭建

    官网简介:Vulhub是一个基于docker和docker-compose的漏洞环境集合,进入对应目录并执行一条语句即可启动一个全新的漏洞环境,让漏洞复现变得更加简单,让安全研究者更加专注于漏洞原理本 ...

  7. Linux值得收藏的40个命令总结,常用的正则表达式

    1 删除0字节文件 find -type f -size 0 -exec rm -rf {} \; 2 查看进程 按内存从大到小排列 PS -e -o "%C : %p : %z : %a& ...

  8. Typora编辑区域空白过大问题

    参考博客:https://blog.csdn.net/m0_55485287/article/details/115207178 在哪个文件编辑? 1.找到使用的主题,打开主题文件夹 2.找到对应的c ...

  9. 组合构造和对应的OGF/EGF Dictionary 备查

    目录 Constructions Cycle Multiset construction Powerset construction Admissible unlabelled constructio ...

  10. 从头开始——重新布置渗透测试环境的过程记录(From Windows To Mac)

    因为疫情和工作的原因,2022年整整一年我基本没有深度参与过网络安全和渗透测试相关的工作. 背景:之前因为使用习惯,一直使用的是ThinkPad X1 Extreme,可联想的品控实在拉胯,奈何Thi ...