当前位置: 首页 > news >正文

页面设计教程seo赚钱暴利

页面设计教程,seo赚钱暴利,招远做网站公司,做网站制作软件文章目录 Tag题目来源题目解读解题思路方法一:贡献法单调栈 写在最后 Tag 【贡献法】【单调栈】【数组】【2023-11-27】 题目来源 907. 子数组的最小值之和 题目解读 计算整数数组的连续子数组中最小值的和。 解题思路 本题朴素的解决思想是求出所有的连续子数组…

文章目录

  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:贡献法+单调栈
  • 写在最后

Tag

【贡献法】【单调栈】【数组】【2023-11-27】


题目来源

907. 子数组的最小值之和


题目解读

计算整数数组的连续子数组中最小值的和。


解题思路

本题朴素的解决思想是求出所有的连续子数组,遍历每一个子数组然后将每一个子数组的最小和加和得到结果,但是该方法时间复杂度过高。现在介绍一种时间复杂度较优的方法——贡献法。

方法一:贡献法+单调栈

我们从数组中的每一个元素作为连续子数组中的最小值这一角度考虑,比如在数组 arr = [3, 1, 2, 4] 中,考虑 1 作为子数组中的最小值的情况,有这些子数组满足 1 是子数组中的最小值 :
[ 3 , 1 ] , [ 3 , 1 , 2 ] , [ 3 , 1 , 2 , 4 ] , [ 1 ] , [ 1 , 2 ] , [ 1 , 2 , 4 ] [3, 1], [3, 1, 2], [3, 1, 2, 4], [1], [1, 2], [1, 2, 4] [3,1],[3,1,2],[3,1,2,4],[1],[1,2],[1,2,4]
共计6个。利用乘法原理有:
6 = ( i − a ) ∗ ( b − i ) = 2 ∗ 3 6 = (i - a) * (b - i) = 2 * 3 6=(ia)(bi)=23
其中,a 表示在 arr 数组中 1 左侧比 1 小的第一个元素的下标,默认值为 -1,此时 a = -1
b 表示在 arr 数组中 1 右侧比 1 小的第一个元素的下标,默认值为 n,此时 b = n

以上是 arr 数组中无重复元素的情况,我们只需要找出元素 arr[i] 左侧第一个比它小的元素下标 a、元素 arr[i] 右侧第一个比它小的元素下标 b,利用乘法原理即可得到 arr[i] 作为连续子数组的最小值时的答案,我们遍历数组中的所有元素,计算作为连续子数组的最小值时的答案,将所有答案进行加和得到最终的答案,时间复杂度为 O ( n ) O(n) O(n)

一般的情况,若是 arr 数组中有重复元素出现会怎么样呢?此处参考 贡献法+单调栈+三种实现版本(附题单)Python/Java/C++/Go。

如果 arr 有重复元素,例如 arr=[1, 2, 4, 2, 3, 1],其中第一个 2 和第二个 2 对应的边界都是开区间 (0,5),子数组 [2, 4, 2, 3] 都包含这两个 2,这样在计算答案时就会重复统计同一个子数组,算出错误的结果。

为避免重复统计,可以修改边界的定义,把右边界改为「找小于或等于 arr[i] 的数的下标」,那么:

  • 第一个 2 对应的边界是 (0,3),子数组需要在 (0,3) 范围内且包含下标 1
  • 第二个 2 对应的边界是 (0,5),子数组需要在 (0,5) 范围内且包含下标 3
    这样以第一个 2 为最小值的子数组,就不会「越界」包含第二个 2 了,从而解决了重复统计子数组的问题。

实现代码

#define MOD 1000000007
class Solution {
public:int sumSubarrayMins(vector<int>& arr) {int n = arr.size();vector<int> lLessIdx(n, -1);vector<int> rLessAndEquIdx(n, n);// 用单调栈更新 lLessIdxint i;stack<int> stk;// [3, 1, 2, 4]for(i = 0; i < n; ++i) {while(!stk.empty() && arr[stk.top()] >= arr[i]) {stk.pop();}if (!stk.empty()) lLessIdx[i] = stk.top();stk.push(i);}   // 用单调栈更新 rLessAndEquIdxwhile (!stk.empty()) stk.pop();for(i = n-1; i >= 0; --i) {while(!stk.empty() && arr[stk.top()] > arr[i]) {stk.pop();}if (!stk.empty()) rLessAndEquIdx[i] = stk.top();stk.push(i);}long ans = 0;for(i = 0; i < n; ++i) {int a = lLessIdx[i], b = rLessAndEquIdx[i];ans += (long)((i - a) * (b - i)) % MOD * arr[i] % MOD; // 乘法原理ans %= MOD;}return (int)ans;}
};

复杂度分析

时间复杂度: O ( n ) O(n) O(n) n n n 是数组 arr 的长度。

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


写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

http://www.yidumall.com/news/1324.html

相关文章:

  • 简单个人网站百度网址大全旧版
  • 重庆做的好的房产网站四川seo技术培训
  • 哪个网站能帮助做试卷百度收录提交入口网址是什么
  • 吉安做网站优化友情链接购买
  • 网站开发样板好看的网站设计
  • 兰州网站制作公司哪个好十大最靠谱培训机构
  • 扫描到网站目录然后怎么做德阳网站seo
  • 搜索引擎优化pptseo职业培训班
  • 尚义网站建设wl17581国内高清视频素材网站推荐
  • 南京行业网站建设如何做品牌宣传与推广
  • 建设手机银行网站网络推广都是收费
  • 北外网院网站建设作业新手小白怎么学做运营
  • 初学者做网站的软件百度官网app下载
  • b2c网站 主要业务流程免费注册域名网站
  • 响应式网站建设代理四川seo推广
  • 网站模板中心 网站推荐电商运营推广是做什么的
  • 大连市平台网站成都网站快速优化排名
  • 应付网站软件服务怎么做分录seo如何快速出排名
  • 免费注册com域名seo是什么化学名称
  • 做h5找图网站黑科技引流推广神器免费
  • 宜春网站建设推广简单制作html静态网页
  • 电脑建设银行怎样设置网站查询网站推广优化网址
  • 网站建设信息发布搜索关键词排名优化服务
  • 深圳网站 建设信科网络跨境电商营销推广
  • 招聘网站做沙龙广州谷歌优化
  • 搜狗网址太原seo管理
  • 有没有做cad单的网站深圳龙岗区疫情最新消息
  • 网站建设中期怎么入账营销推广公司案例
  • 淘宝做网站被骗什么是seo是什么意思
  • 独立系统网站站长之家怎么用