【LeetCode】891.子序列宽度之和

news2025/7/26 7:55:37

**> ## 题目描述

一个序列的 宽度 定义为该序列中最大元素和最小元素的差值。
给你一个整数数组 nums ,返回 nums 的所有非空 子序列 的 宽度之和 。由于答案可能非常大,请返回对 109 + 7 取余 后的结果。
子序列 定义为从一个数组里删除一些(或者不删除)元素,但不改变剩下元素的顺序得到的数组。例如,[3,6,2,7] 就是数组 [0,3,1,6,2,2,7] 的一个子序列。

示例 1:

输入:nums = [2,1,3]
输出:6
解释:子序列为 [1], [2], [3], [2,1], [2,3], [1,3], [2,1,3] 。
相应的宽度是 0, 0, 0, 1, 1, 2, 2 。
宽度之和是 6 。

示例 2:

输入:nums = [2]
输出:0

提示:

1 <= nums.length <= 105
1 <= nums[i] <= 105

方法一:元素贡献度

class Solution {
public:
    const int MOD = 1e9+7;
    int sumSubseqWidths(vector<int>& nums) {
        // 排序
        sort(nums.begin(), nums.end());
        long sum=0;
        int n=nums.size(), pow2[n];
        pow2[0]=1;

        // 预先处理pow2 即二次幂
        for(int i=1; i<n; i++)  pow2[i] = pow2[i-1] * 2 % MOD;

        for(int i=0; i<n; i++){
            sum += long(pow2[i] - pow2[n- i -1]) * nums[i];
        }
        return (sum % MOD + MOD) % MOD;
    }
};

方法二:方法一 + 快速幂

class Solution {
public:
    const int MOD = 1e9+7;
    // 快速幂(迭代)
    long pow(long x, int n){
        long res = 1L;
        for(; n; n/=2){
            // n的最低位为1,需要计入贡献
            if(n % 2)   res = res * x % MOD;
            x = x * x % MOD;
        }
        return res;
    }
    int sumSubseqWidths(vector<int>& nums) {
        // 排序
        sort(nums.begin(), nums.end());
        long sum=0L;
        int n=nums.size();


        for(int i=0; i<n; i++){
            sum += (pow(2L, i) - pow(2L, n-1-i)) * nums[i];
        }
        return (sum % MOD + MOD) % MOD;
    }
};

心得

  • 这道题本来打算自己做的,一开始还想到了set,但是对于单个元素的操作不方便,最后还是看了题解。
  • 方法一:计算每个元素的贡献度
    1.具体思路看图就很简单了,这里解释一下为什么最终的贡献是 (2i - 2n-1-i) * x,对于元素x而言,作为最大值的时候需要减去最小值,那么在最终表达式展开的时候就有2i * x ,作为最小值的时候会被最大值减去,即-2n-1-i * x,整合一下就得到 (2i - 2n-1-i) * x
    2.另外,通过排序可以快速得知nums[i]的大小顺序;
    3.对于nums[i]的重复问题,无论是把nums[i]当作最大值还是最小值,组合数总取决于某一侧的个数,因此不会对正确答案产生影响。
    4.对于2k操作的重复问题,可以通过预先计算2的k次幂,之后之间查表获得。方法二会针对这个问题进行优化,即快速幂运算
  • 方法二:在方法一上优化,加入快速幂运算
    快速幂的思想分为两种:快速幂+递归快速幂+迭代,具体看参考资料2。方法二采取的是迭代思想。

在这里插入图片描述

参考资料:
[1] 计算每个元素对答案的贡献,多解法(Python/Java/C++/Go)
[2] 【宫水三叶】逐步分析如何求解对展开式的最终贡献
[3] 快速幂运算

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/16808.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Scala009--Scala中的数据结构【映射】

目录 一&#xff0c;概述 二&#xff0c;map的声明 1&#xff0c;不可变map 三&#xff0c;HashMap的声明 1&#xff0c;可变hashmap 四&#xff0c;map常用函数 1&#xff0c;查看map中的元素个数 size 2&#xff0c;获取map集合中key对应的value值 1&#xff09;使…

react源码中的hooks

今天&#xff0c;让我们一起深入探究 React Hook 的实现方法&#xff0c;以便更好的理解它。但是&#xff0c;它的各种神奇特性的不足是&#xff0c;一旦出现问题&#xff0c;调试非常困难&#xff0c;这是由于它的背后是由复杂的堆栈追踪&#xff08;stack trace&#xff09;支…

更新后的python seaborn用于科研图绘

python seaborn 0.12 数据科学和科研绘图的人离不开R的ggplot2&#xff0c;尽管python已经有了诸如matplotlib、seaborn等强大绘图包&#xff0c;兼有basemap、cartopy等空间数据可视化能力&#xff0c;但相较于R的ggplot&#xff0c;总感觉欠缺了点东西。 前不久seaborn更新…

Ubuntu系统安装

一、制作启动盘 首先格式化U盘&#xff0c;格式选NTFS 制作启动盘&#xff0c;这里使用的是ultraISO&#xff0c;也是使用最多的方式。 打开文件&#xff0c;选中下载好的镜像iso文件。 启动 -> 写入硬盘映像 选择自己的U盘&#xff0c;写入方式选择 USB-HDD&#xff0c;隐…

进程地址空间详解

文章目录空间布局图首先有一个问题&#xff0c;我们曾经学过的程序地址空间是内存吗&#xff1f;&#xff1f;&#xff1f;为什么fork()会返回两个值先来看一下一个代码的现象在这里插入图片描述在C/C中我们看到的地址是物理地址吗&#xff1f;为什么操作系统不让我直接看到物理…

SpringBoot整合RabbitMQ

RabbitMQ安装部署详情可见&#xff1a;RabbitMQ简介及在Linux中安装部署&#xff08;yum&#xff09; 一、导入pom.xml依赖 <dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.8.0</versio…

简单的抓包

验证TCP/IP协议栈结构、帧结构 准备&#xff1a; 用到的软件&#xff1a;科来网络分析系统、putty 1&#xff09;准备两台虚拟机&#xff08;我这里准备windows2003、7&#xff09;&#xff0c;并让两台虚拟机可以互相通信&#xff08;配置IP&#xff0c;让他们处于同一局域网…

基于SSM的网络教学(作业)管理系统

1、项目介绍 基于SSM的网络教学&#xff08;作业&#xff09;管理系统拥有三种角色&#xff1a;管理员、教师和学生 管理员&#xff1a;教师管理、学生管理、课程管理、教学信息管理、作业管理、试卷管理、试题管理、论坛管理、系统管理、考试管理等 教师&#xff1a;课程信…

【快速上手系列】使用支付宝沙箱环境进行支付测试的快速上手

【快速上手系列】使用支付宝沙箱环境进行支付测试的快速上手 步骤 一、支付宝开放平台 1、进入支付宝开放平台&#xff0c;登录&#xff0c;然后点击控制台&#xff0c;划到最下面&#xff0c;点击沙箱 2、APPID一会要用到&#xff0c;然后将接口加签方式选择为自定义密钥&a…

【Bio】基础生物学 - 细胞膜 cell membrane

文章目录1. 细胞膜1.1 内平衡1.2 选择透过性1.3 流动镶嵌模型Ref1. 细胞膜 没有细胞膜&#xff0c;就没有细胞。 不论是否有细胞壁&#xff0c;所有的细胞都有细胞膜&#xff0c;也叫做 质膜 (plasma membrane)\blue{\text{质膜 (plasma membrane)}}质膜 (plasma membrane)。…

RabbitMQ系列【10】死信队列

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 文章目录概念创建死信交换机、队列过期导致死信拒接消费长度限制概念 无法被消费的消息被称为死信&#xff0c;存放死信的队列也就是死信队列。 由于某些特定的原因导致队列中的某些消息无法被消费&am…

【数据结构】c++栈的应用:波兰式、逆波兰式和中缀表达式计算器

********************************************************************************************************* 本文作者科大MF22某班Noah懒羊羊同学&#xff0c;为大家提供一个作业思路&#xff0c;请勿直接copy&#xff01;&#xff01;&#xff01;一起进步学习~ ********…

Mac 通过docker安装MinIO

前言 最近MeterSphere出了新版本&#xff0c;新版本架构是这样的&#xff08;如下图&#xff09;。采用了SpringCloudSpringBoot 微服务的架构的。跟以往相比&#xff0c;多了一个新的组件&#xff0c;MinIO。也就是分布式存储。 关于MinIO 1、MinIO是什么&#xff1f; 官方…

[附源码]java毕业设计某互联网公司人力资源管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【C语言】操作符详解

目录 1、操作符分类 2、算术操作符 3、移位操作符 (二进制) 3.1 左移操作符 3.2 右移操作符 4、位操作符 5、赋值操作符 6、单目操作符 6.1 单目操作符介绍 6.2 sizeof和数组 7、关系操作符 8、逻辑操作符 9、条件操作符 10、逗号表达式 11、下标引用、函…

微信对账单功能开发(V2)

下载交易账单接口开发 应用场景&#xff1a; 商户可以通过该接口下载历史交易清单。比如掉单、系统错误等导致商户侧和微信侧数据不一致&#xff0c;通过对账单核对后可校正支付状态。 注意&#xff1a; 1、微信侧未成功下单的交易不会出现在对账单中。支付成功后撤销的交易…

Azure Integrator Delphi版

Azure Integrator Delphi版 Azure Integrator包括表、队列和Blob等标准Windows Azure结构的实现&#xff0c;使开发人员能够快速轻松地将基于云的数据存储、队列管理、表配置等添加到任何桌面、Web或移动应用程序中。 Azure Integrator功能 用于访问Windows Azure表、Blob和队列…

python folium 实现地图平台制作

python实现泸定地震点观测平台制作 数据来自[走天涯徐小洋地理数据科学]&#xff0c;原始数据来自微博中国地震台网 的正式测定数据。 以下是地震点的数据&#xff1a; MagnitudeDateTimeLongitudeLatitudeDepth6.82022-9-512:52102.0829.59163.12022-9-65:28102.0729.64113…

[附源码]java毕业设计览宏公司会议管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

01. 信息搜集:Web 1~10

Web 1~10web1知识点题解web2知识点题解web3知识点题解web4知识点题解web5知识点题解web6知识点题解web7知识点题解web8知识点题解web9知识点题解web10知识点题解web1 知识点 查看网页源码&#xff1a;ctrl u 或 F12 开发注释未及时删除 题解 查看网页源码即可。 web2 知识…