Leetcode 891. 子序列宽度之和
创始人
2024-01-29 12:19:45
0
一个序列的 宽度 定义为该序列中最大元素和最小元素的差值。给你一个整数数组 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 <= 1051 <= nums[i] <= 105
  • 首先,宽度定义为该序列中最大元素和最小元素的差值。那么将任何子序列排序后的结果并不影响其宽度,因此我们将数组排序后也不影响答案的计算。
    在这里插入图片描述

    通过上述推导,我们可以得出表格中的宽度计算值。
    通过观察发现,对于某个数nums[i],我们统计其在宽度计算时出现的情况即可,会加上nums[i]:1+2+4+...+2i−1=2i−11+2+4+...+2^{i-1}=2^i-11+2+4+...+2i−1=2i−1次,会减去2n−i−1−12^{n-i-1} - 12n−i−1−1次
    那么对于某个数nums[i]来说,它对宽度的贡献为:(2i)∗nums[i]−nums[i]∗(2n−i−1−1)=nums[i]∗(2i−2n−i−1)(2^{i}) * nums[i] - nums[i] * (2^{n-i-1} - 1) = nums[i] * (2^i - 2^{n-i-1})(2i)∗nums[i]−nums[i]∗(2n−i−1−1)=nums[i]∗(2i−2n−i−1)
    对于2i2^i2i,可以利用数组提前计算。
    最后,我们循环遍历每一个数统计其宽度的累加值即可。

  • 时间复杂度:O(nlogn)O(nlogn)O(nlogn)

  • 空间复杂度:O(n)O(n)O(n)

class Solution {public int sumSubseqWidths(int[] nums) {int n = nums.length, et = n - 1, st = 0, mod =(int)(1e9 + 7);long[] pow = new long[n + 5];long ans = 0, last = 1;Arrays.sort(nums);for (int i = 0; i <= n; i++) {pow[i] = last - 1;last = last * 2 % mod;}for (int i = 0; i < n; i++, st++, et--)  ans = (ans + (pow[st] - pow[et]) * nums[i]) % mod;return (int) ans;} 
}
  • 空间优化:O(long)O(long)O(long),为排序所需要的空间
  • 我们使用一个变量来保存2i2^i2i的结果,对于第一个数来说是20−2n−12^0 - 2^{n-1}20−2n−1, 对于最后一个数来说是2n−1−202^{n-1}-2^02n−1−20,那么每次计算宽度值的时候算第i个数和第n-i-1个数,即(nums[i]−nums[n−i−1])∗pow(nums[i] - nums[n-i-1]) * pow(nums[i]−nums[n−i−1])∗pow
class Solution {public int sumSubseqWidths(int[] nums) {int n = nums.length, mod =(int)(1e9 + 7); long ans = 0, pow = 1;Arrays.sort(nums);for (int i = 0; i < n; i++, pow = (pow * 2) % mod) ans = (ans + pow * (nums[i]  - nums[n - i - 1])) % mod;return (int) ans;} 
}

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...