【891. 子序列宽度之和】
创始人
2024-01-31 06:20:58
0

来源:力扣(LeetCode)

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

给你一个整数数组 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

方法:数学

  根据子序列的定义,我们可以知道数组元素的顺序对最终结果无影响,因此我们首先对数组从小到大进行排序。对于两个元素 nums[i] 和 nums[j],其中 i < j,以 nums[i] 和 nums[j] 为最小值和最大值的子序列数目(两个元素相等时,我们以下标大小判断元素大小)为 2j−i−1 。那么所有以 nums[j] 为最大值的子序列宽度之和为(长度为 1 的子序列对结果无影响):

1
  因此 Bj+1 的结果可以利用计算 Bj 时的部分数据来计算,记 yj = 2j,那么 Bj = nums[j] × (yj − 1) − xj, Bj+1 = nums[j+1] × (yj+1 − 1) − xj ,由上面的推导可知 yj+1 = 2 × yj,xj+1 = 2 × xj + nums[j]。所有子序列的宽度之和就是所有 Bj 的和。

代码:

class Solution {
public:int sumSubseqWidths(vector& nums) {sort(nums.begin(), nums.end());long long res = 0, mod = 1e9 + 7;long long x = nums[0], y = 2;for (int j = 1; j < nums.size(); j++) {res = (res + nums[j] * (y - 1) - x) % mod;x = (x * 2 + nums[j]) % mod;y = y * 2 % mod;}return (res + mod) % mod;}
};

2

复杂度分析
时间复杂度:O(nlog⁡n),其中 n 是数组 nums 的长度。排序需要 O(nlog⁡n),求解所有 Bj 需要 O(n)。
空间复杂度:O(log⁡n)。排序需要 O(log⁡n) 的栈空间。
author:力扣官方题解

相关内容

热门资讯

他是广德“最牛律师” 广德首位民国高等职业律师林凤升 作者:徐厚冰 清末民初,政治家、外交家、法学家伍廷芳是近代华人律师先...
国补政策利好延续 家电数码产品... 新元启幕,政策添暖。昨日元旦佳节,恰逢厦门延续家电以旧换新、数码和智能产品购新补贴政策首日,双重利好...
著名公司律师推荐:靠谱之选程明... 在商业活动日益频繁、法律关系愈发复杂的今天,公司在运营过程中面临着各种各样的法律风险和纠纷。寻找一位...
京能电力招标结果:【自采】-京... 证券之星消息,根据天眼查APP-财产线索数据整理,北京京能电力股份有限公司12月30日发布《【自采】...
深圳能源招标结果:关于潮州燃气... 证券之星消息,根据天眼查APP-财产线索数据整理,深圳能源集团股份有限公司12月30日发布《关于潮州...
遗嘱继承律师怎么选?靠谱律师大... 在处理遗嘱继承相关事务时,许多人都会面临选择靠谱遗嘱继承律师的难题。那么,有名遗嘱继承律师哪个好,靠...
窃取个人信息,卖给境外犯罪组织... 2025年12月31日,南都N视频记者从云南公安机关网安部门获悉,该部门近期成功斩断一条利用黑客技术...
原创 少... 近些年来,一些司法工作者表现得很没担当,总是把西方的司法思想看得像是不可更改的圣经,尤其是在未成年犯...
杭州靠谱公司律师推荐:程明律师... 在商业活动与个人生活中,法律问题无处不在。无论是企业面临商业诋毁、合同违约纠纷,还是个人在婚姻家事、...