首页 > 其他分享 >2023-04-29:一个序列的 宽度 定义为该序列中最大元素和最小元素的差值。 给你一个整数数组 nums ,返回 nums 的所有非空 子序列 的 宽度之和 由于答案可能非常大,请返回对 109

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

时间:2023-04-29 20:56:40浏览次数:42  
标签:nums int 宽度 let ans 序列 mod

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;
}

在这里插入图片描述

标签:nums,int,宽度,let,ans,序列,mod
From: https://www.cnblogs.com/waitmoon/p/17364462.html

相关文章

  • C# 序列化操作类
    usingSystem;usingSystem.Collections.Generic;usingSystem.IO;usingSystem.Linq;usingSystem.Runtime.Serialization.Formatters.Binary;usingSystem.Text;usingSystem.Threading.Tasks;namespaceEIMS{[Serializable]publicstaticclass_Serial......
  • 将时间序列转换为分类问题
    本文将以股票交易作为示例。我们用AI模型预测股票第二天是涨还是跌。在此背景下,比较了分类算法XGBoost、随机森林和逻辑分类器。文章的另外一个重点是数据准备。我们必须如何转换数据以便模型可以处理它。在本文中,我们将遵循CRISP-DM流程模型,以便我们采用结构化方法来解决业......
  • xml 序列化
    usingSystem.Text;usingSystem.Xml;usingSystem.Xml.Serialization;varp=newPerson{Id=1,Name="Furion",Items=newList<string>{"Furion","百小僧"}};varxml=XmlSerialize(p);Console.ReadKe......
  • Python用RNN神经网络:LSTM、GRU、回归和ARIMA对COVID19新冠疫情人数时间序列预测|附代
    全文下载链接: http://tecdat.cn/?p=27042最近我们被客户要求撰写关于新冠疫情的研究报告,包括一些图形和统计输出。在本文中,该数据根据世界各国提供的新病例数据提供。获取时间序列数据df=pd.read_csv("C://global.csv")探索数据此表中的数据以累积的形式呈现,为了找出每天......
  • 利用深度学习实现序列模型
    利用深度学习实现序列模型序列问题的含义是接收一个序列作为输入,然后期望预测这个序列的后续。例如继续预测2,4,6,8,10...。这在时间序列中是相当常见的,可以用来预测股市的波动、患者的体温曲线或者赛车所需的加速度。从原理上说,卷积神经网络可以有效处理空间信息,那么循环神经网......
  • 怎样制作从负数开始的序列号
    在使用条码标签软件时,有的用户除了批量制作条码或二维码,也会制作一些序列号。我们通常用到的序列号都是0、1、……、8、9这种的,但是如果需要的序列号是从负数开始,像“-10、-9、-8、……0、1、2、3…”这种的(如下图),要怎么实现呢?下面我们演示一下在条码标签软件中制作从负数开始的序......
  • Protostuff对象序列化工具
    VO.javaimportjava.io.Serializable;/***[概要]java对象序列化工具<br/>*[环境]J2SE1.7*@author研发部-ly*@version1.0*/publicclassVO<T>implementsSerializable{privateTvalue;publicVO(Tvalue){this.value=value;......
  • 高性能序列化、反序列化protostuff 使用
    1、引用jar包:pom.xml:<!--protostuff--><dependency><groupId>com.dyuproject.protostuff</groupId><artifactId>protostuff-core</artifactId><version>1.0.7</version>......
  • 面试官:说说你对序列化的理解
    关注“Java后端技术全栈”回复“000”获取大量电子书本文主要内容背景在Java语言中,程序运行的时候,会产生很多对象,而对象信息也只是在程序运行的时候才在内存中保持其状态,一旦程序停止,内存释放,对象也就不存在了。怎么能让对象永久的保存下来呢?--------对象序列化。何为序列化和反序......
  • Fastjson反序列化漏洞
    Fastjson反序列化漏洞目录Fastjson反序列化漏洞一、Fastjson介绍1、什么是fastjson?2、fastjson的优点二、影响范围:三、漏洞原理四、漏洞利用五、漏洞发现六、漏洞修复一、Fastjson介绍1、什么是fastjson?fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Ja......