wy的leetcode刷题记录_Day45
admin
2024-02-06 01:04:55

wy的leetcode刷题记录_Day45

声明

本文章的所有题目信息都来源于leetcode
如有侵权请联系我删掉!
时间:2022-11-18

前言

补

目录

  • wy的leetcode刷题记录_Day45
    • 声明
    • 前言
    • 891. 子序列宽度之和
      • 题目介绍
      • 思路
      • 代码
      • 收获

891. 子序列宽度之和

今天的每日一题是:891. 子序列宽度之和

题目介绍

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

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

思路

数学方法:贡献度。首先很多人估计会认为这个子序列跟原序列的顺序有关,其实不然,仔细看题目,题目要求的是宽度,也就是最大值与最小值之和,其实他与原序列的顺序无关,只是这个宽度的覆盖范围也就是贡献度有关,于是我们将其排序,计算其贡献度(最大值贡献度和最小值贡献度求得宽度贡献度)然后累加即可。

代码

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

收获

这题对于数学思维结构理解要求很高

相关内容

热门资讯

山水皆有情!丽江两山一江的千年... 去过丽江、走过虎跳峡的人,大概率都听过哈巴雪山和金沙江的传说。很多人站在峡谷之下,望着奔腾不息的金沙...
活力中国调研行丨“殷”你而来 ... 9月12日,游客在殷墟博物馆“甲骨文展厅”内参观。位于河南省安阳市的殷墟博物馆新馆是首个全景式展现商...
浦江之夜赴美好相逢,第37届上... 9月12日晚,黄浦江畔灯火璀璨,第37届上海旅游节大巡游在外滩中山东一路上演。不少观众早早便来到外滩...
美丽中国丨秋韵紫鹊界 梯田入画... 这是9月11日拍摄的紫鹊界梯田(无人机照片)。 金秋九月,湖南省娄底市新化县紫鹊界梯田稻谷渐次成熟。...
中国之巅奏响《共同的节日》,千... 千吨阻尼器,“迎世赛、游上海旅游节”。9月13日,由上海市文化和旅游局指导推出上海旅游·会客│巅峰之...