2023-04-29:一个序列的 宽度 定义为该序列中最大元素和最小元素的差值。 给你一个整数数组 nums ,返回 nums 的所有非空 子序列 的 宽度之和 由于答案可能非常大,请返回对 109
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:
解题思路:
- 排序
首先对数组进行排序,这样我们就可以根据每个子序列的首尾元素来计算它的宽度了。
- 计算宽度
我们使用 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
- 取模
由于答案非常大,需要对其进行 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的更多相关文章
- java——设计一个支持push,pop,top、在恒定时间内检索最小元素的栈。
普通方法: 需要另外一个栈 用来存放每一时刻的min值 巧妙版: 只需要一个stack,stack中存的是与min的差值 但由于min是两个整数之间的差值,有可能会出现差值超过整数边界值的情况,因此要 ...
- 现在有一个城市销售经理,需要从公司出发,去拜访市内的商家,已知他的位置以及商家的位置,但是由于城市道路交通的原因,他只能在左右中选择一个方向,在上下中选择一个方向,现在问他有多少种方案到达商家地址。给定一个地图map及它的长宽n和m,其中1代表经理位置,2代表商家位置,-1代表不能经过的地区,0代表可以经过的地区,请返回方案数,保证一定存在合法路径。保证矩阵的长宽都小于等于10。
include "stdafx.h" #include<iostream> #include<vector> #include<algorithm&g ...
- 【记录一个问题】铁威马NAS存储中的人人影视APP,其WEB服务占满一个CPU核
终端登录后,top命令发现rrshareweb这个进程把单个CPU核占满了. 发现其实是人人影视的web服务,而这个服务里面我还根本未使用. 卸载这个app后正常.
- 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 ...
- ALTER SEQUENCE - 更改一个序列生成器的定义
SYNOPSIS ALTER SEQUENCE name [ INCREMENT [ BY ] increment ] [ MINVALUE minvalue | NO MINVALUE ] [ MA ...
- LeetCode 周赛 342(2023/04/23)容斥原理、计数排序、滑动窗口、子数组 GCB
本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 大家好,我是小彭. 前天刚举办 2023 年力扣杯个人 SOLO 赛,昨天周赛就出了一场 Easy - Ea ...
- ie10中元素超出父元素的宽度时不能自动隐藏
(从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期2014-02-21) 今天遇到一个问题,ie10中元素超出父元素的宽度时不能自动隐藏,而其余浏览器却正常显示. 解决方法是,手动给其设 ...
- 我的第一个Python程序,定义主函数,eval、format函数详解,
程序实例: #第一个py小程序 def main(): f = eval(input("输入一个数值:")) p=f*(5/9) print("现在的值为:{0:3.3f ...
- html中label宽度设置、非替换元素和替换元素
<label ></label> 单独对label设置一个width:100px的属性石不起作用的,和float:left或者display:inline-block配合的话 ...
- [oracle] ORA-08002:序列XXXXXXX.CURRVAL尚未在此进程中定义
出现 ORA-08002: 序列XXXXXXX.CURRVAL 尚未在此进程中定义. 导致原因:因为是首次查询序列的当前值,内存中之前并没有缓存序列的任何值,所以需要先查询 一下序列的下一个值(此时, ...
随机推荐
- 2020.11.24 javaScript匿名函数的使用
参考链接:http://www.voidcn.com/article/p-ngxxuegm-bmv.html 匿名函数: 函数表达式中创建的函数叫做匿名函数,也就是没有函数名的函数. 自执行函数: 创 ...
- python中时间的datatime的模块
datetime.datetime.now().strftime('%Y-%m-%d-%H_%M_%S')1.python datetime模块用strftime 格式化时间 import datet ...
- zookeeper异常
1. KeeperErrorCode = Unimplemented for /service 在使用curator时,对zk有版本匹配关系. Curator 2.** <---> ...
- fatal: unable to access ' ' OpenSSL SSL_read: Connection was reset, errno 10054
描述: git clone ...时报错 fatal: unable to access 'https://github.com/github-eliviate/papers.git/': OpenS ...
- Static详细讲解
Static详细讲解 package com.andy.base.oop.demo01.demo07; import sun.dc.path.PathError; public class Perso ...
- 移动端pdf预览---vue-pdf
<template> <div class="mainBody"> <!-- <div v-if="isLoading" c ...
- Python 中 is 和 == 的区别
is 和 == 的区别 相信学过 Python 小伙伴们都知道 is 和 == 都是用来比较 Python 对象的,但是区别就是 is 比较需要对象的值和内存地址都相等 == 比较只需要对象的值相等就 ...
- nginx中的proxy_pass配置
Nginx 是最常用的反向代理工具之一,一个指令 proxy_pass搞定反向代理,对于接口代理.负载均衡很是实用,但 proxy_pass指令后面的参数很有讲究,通常一个/都可能引发一个血案. 通常 ...
- ChatGPT 开源了第一款插件,都来学习一下源码吧!
3 月 23 日,OpenAI 又投出了一枚重磅炸弹:为 ChatGPT 推出插件系统! 此举意味着 ChatGPT 将迎来"APP Store"时刻,也就是围绕它的能力,形成一个 ...
- 配置了一台3700X电脑后
众所周知,电脑是生活中必不可少的玩具,最近搞了一套配置.CPU3700X,显卡RX580,内存32GB.敲,这CPU的框框,看见就爽的不得了. As we all know, a comput ...