每日一题 —— LC. 891 子序列的宽度之和
admin
2024-04-12 04:29:19
0

891. 子序列的宽度之和

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

给你一个整数数组 nums ,返回 nums 的所有非空 子序列宽度之和 。由于答案可能非常大,请返回对 109+710^9 + 7109+7 取余 后的结果。

子序列 定义为从一个数组里删除一些(或者不删除)元素,但不改变剩下元素的顺序得到的数组。例如,[3,6,2,7] 就是数组 [0,3,1,6,2,2,7] 的一个子序列。

提示:

  • 1 <= nums.length <= 10^5
  • 1 <= nums[i] <= 10^5

示例

输入: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 。

思路

暴力是人类最直观的思维,如果要暴力来做,那么就是枚举所有的子序列,然后依次计算每个子序列中的最大值和最小值,求出每个子序列的宽度,然后进行累加。假设数组的长度为n,那么所有子序列的数量就是2n2^n2n,因为生成一个子序列,就是对每个元素进行选择:保留or删除。每个元素有2种选择,则n个元素就一共有 2n2^n2n 种方案。

此题的数据范围是 10510^5105,也就是 n=105n = 10^5n=105。

暴力是一定行不通的。

此时我们转换思维,不从子序列来推最小值最大值,而从最小值最大值来推子序列。

什么意思呢?就是对于数组中的某个元素,我们计算一下,这个元素作为最小值的子序列,有多少个;这个元素作为最大值的子序列,又有多少个。我们要求的是所有子序列的最大值减最小值的。那么我们就能算出这个元素对于最终答案的贡献。假设这个元素为a,以a作为最小值的子序列共有L个,以a作为最大值的子序列共有R个,那么该元素对答案的贡献就是 a × (R - L)

我们只要对数组中每个元素,计算一下其对答案的贡献,然后进行一下累加即可。


关键点一:不从子序列来推最小值最大值,而从最小值最大值来推子序列


然后,对于某个子序列,我们只关心它的两个最值,那么子序列内部元素的顺序就无关紧要。比如,子序列 1 3 5 7和子序列5 7 3 1,我们其实可以将其看成等价,这并不会影响最终答案的正确性。

所以,我们可以对整个数组先排个序。

为什么要排序呢?因为排序后能够很方便的计算某个元素作为最大值和最小值的子序列的个数!


关键点二:顺序无关


排完序后,对于某个位置i的数,它比[0, i - 1]的所有数都大,比[i + 1, n - 1]的所有数都小。(这里其实不是严格的大小关系,因为有可能存在相等的元素)。

也就是说,[0, i]中第i个数是最大值(可能有相等的但不影响),[i, n - 1]中第i个数是最小值。

由于某个子序列,是保留一些数,和删去一些数。那么第i个数作为最大值的子序列,一定需要保留第i个数,对于前面的[0, i - 1]区间的数,每个数都有保留或者不保留的选择,那么能形成的子序列数量是 2i2^{i}2i;所以以第i个数作为最大值的子序列的个数是 2i2^i2i;同理,对于以第i个数作为最小值的子序列,一定要保留第i个数,对于后面的[i + 1, n - 1]区间内的每个数,都有保留或者不保留的选择,那么能形成的子序列数量是 2n−1−i2^{n - 1 - i}2n−1−i;

那么第i个数对答案的贡献就是 (2i−2n−1−i)×nums[i](2^i-2^{n-1-i}) × nums[i](2i−2n−1−i)×nums[i]


关键点三:排序后,推公式


所以,我们可以进行一次遍历,挨个累加每个元素的贡献,就能得到最终的答案

// C++
typedef long long LL;
const int MOD = 1e9 + 7;
class Solution {
public:// 快速幂LL qmi(LL a, LL b, LL p) {LL t = a, ans = 1;while (b) {if (b & 1) ans = (ans * t) % p;b >>= 1;t = (t * t) % p;}return ans;}// 每个值作为最小值的序列个数// 每个值最为最大值的序列个数// 计算每个值对答案的贡献int sumSubseqWidths(vector& nums) {sort(nums.begin(), nums.end());LL mi = 0, ma = 0; // 最小值的和, 最大值的和int n = nums.size();for (int i = 0; i < n; i++) {// 组合数求和Cn0+Cn1+...+Cnn = 2^n// nums[i]作为最大值的子序列个数ma = (ma + qmi(2, i, MOD) * nums[i]) % MOD;// nums[i]作为最小值的子序列个数mi = (mi + qmi(2, n - 1 - i, MOD) * nums[i]) % MOD;}return (int) ((ma - mi + MOD) % MOD);}
};

小结

本题是上周五的每日一题。

当按正向的直观的逻辑无法求解时,可以逆向思考,考虑单个元素对整体答案的贡献值。

运用这样思维的题目,还有10月底某天的每日一题(907. 子数组的最小值之和),以及今天(2022/11/24)的每日一题(795. 区间子数组个数),这两道题都可以采用这样的思维,加上单调栈,进行求解。

相关内容

热门资讯

4家银行AIC现身存储巨头股东... 近日,资本市场热度颇高的两家存储巨头长鑫科技集团股份有限公司(以下简称“长鑫科技”)、长江存储控股股...
8元无限续杯、0元看电影、老字... 城市的烟火暖意,藏在亲民的消费场景里,也藏在老地标的新生蜕变中。粤汉码头火车旁新开竹林茶馆,8元就能...
2026年水利工程新趋势,这些... 随着全球气候变化和城市化进程的加速,水利工程在保障水资源供给、改善生态环境以及提升人民生活质量中的作...
原创 发... 这几年,身边越来越多人开始换一种活法:不急着买房,不执着“上车”,反而愿意把钱拿去租一套更舒服、更体...
小红书入场Skill分发,B站... 来源:界面新闻 文丨AI价值官 星野 编辑丨美圻 过去半年,Skill 这个词在AI圈的出现...
2026年福州企业门户网站建设... 本篇将回答的核心问题 在数字化转型加速的2026年,企业门户网站建设应遵循哪些核心评估标准,以确保投...
原创 今... 今日金价:2026年5月22日注意了!黄金或现历史类似回调走势 5月22日,金市又热闹起来了,咱们看...
雷军发布YU7 GT、YU7标... 5月21日,小米人车家全生态新品发布会在北京举办,小米集团创始人、董事长兼CEO雷军正式发布小米YU...
留神峪煤矿瓦斯爆炸事故发布会:... 昨晚,山西留神峪煤矿发生瓦斯爆炸,造成重大人员伤亡。今天,当地召开新闻发布会,现场全体默哀。会上介绍...
原创 修... 修复资产负债表,日本花了几十年。 自上世纪90年代初泡沫经济破裂后,日本陷入了长达三十年的通缩螺...
2026年小红书效果化种草白皮... 2026 年小红书正式迈入种草效果化时代,这是品牌追求预算确定性回报与平台升级为消费决策、用户信任场...
连续18年获“全国文化企业30... 南都讯 记者钟欣5月21日,第二十二届中国(深圳)国际文化产业博览交易会开幕。展会期间,光明日报社和...
荣耀确认IPO未终止!开放员工... 5月22日,荣耀因股改满一年未完成IPO,按约定正式开放员工持股退出通道。据《财闻》报道称,当日16...
易方达蓝筹精选有新变动:增聘2... 《每日经济新闻》记者获悉,继景顺长城、中欧等多家基金公司旗下百亿基金经理产品调整后,易方达基金也迎来...
光储龙头,又翻倍了 去年海外光储赛道最受关注的公司,毫无疑问是阳光电源,市值重回巅峰,风光无限。 但今年一季度业绩突然失...
中企出海报告在静安发布,七成受... 来源:滚动播报 (来源:上观新闻) 昨天,在上海静安举办的澳洲会计师公会出海论坛暨澳洲注册会计师颁...
京蒙协作延链强链 科右中旗牛产... 初夏时节,走进内蒙古华阳牛业科技集团有限公司屠宰加工车间,自动化生产线高效运转。作为京蒙协作产业帮扶...
原创 中... 最近发布了一份有关新一线城市魅力的榜单。榜单按照商业资源聚集度、城市枢纽性、城市人活跃度这五个方面来...
突然,全线跳水!超16万人爆仓 来源:宁波晚报 5月23日,被视作反映市场风险偏好指标的加密货币持续跳水。 截至发稿,比特币大跌3....
基民懵了!说好的科技行情,结果... 每经记者:叶峰 每经编辑:赵云 本周股指冲高回落,沪深两市股票型ETF和跨境型ETF合计净流出729...