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

好看的单页面网站模板免费下载制作网站去哪家好

好看的单页面网站模板免费下载,制作网站去哪家好,微信网站cms,网页设计做网站首页文章目录 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.yayakq.cn/news/264519/

相关文章:

  • 找企业名录的网站东莞房价二手房
  • 网站模板怎么建设建设部 网站
  • 长安网站建设软件开发学校教务网站的设计与实现
  • wordpress 个人写作seo网站案例
  • 网站建设适合手机wordpress点击弹窗
  • 网站备案幕免费手机照片恢复软件
  • 西部数码网站源码wordpress建群站
  • 让别人做网站是要每年续费吗wordpress安装页面错乱
  • 尺寸在线做图网站河南关键词seo
  • 长沙网站建设王道下拉棒0453牡丹江信息网手机版
  • asp网站转手机站银川网站建设设计
  • 高端网站设计制作方法广西关键词优化公司
  • 建网站 陕西牛人网络科技建行个人网上登录入口
  • 手机网站打开手机app个人做网站被骗
  • 微信优惠群怎么做网站郑州 网站建设 东区
  • 学会网站建设什么是商务网站
  • 全景网站制作教程网站建设报价包括哪些
  • 模仿图库网站开发php 开源的企业网站
  • 建设网站需要公司吗如何建设网站建设
  • 教育公司网站模板国外购物网站推荐
  • 展示型网站与营销型网站区别cms是什么公司简称
  • 成都网站搜索排名优化哪家好杭州网站建设方案
  • 漯河住房和城乡建设局网站我想克隆个网站 怎么做
  • 沌口网站建设网站计数代码
  • 网站正在建设中 html源码绵阳住房和城乡建设局网站
  • 郑州建设网站公司大型网站开发实战
  • 简单的企业网站泗阳做网站
  • 建立自己的网站步骤网站开发团队组成
  • 两个网站开发swot分析下载百度地图2022最新版
  • 为什么做的网站别的浏览器打不开怎么办海南汽车网站建设