牛客2024 【牛客赛文X】春招冲刺 ONT84 子数组的最小值之和【中等 单调栈 Java、Go、PHP】

题目

在这里插入图片描述题目链接:
https://www.nowcoder.com/practice/a7401d0dd4ec4071a31fd434e150bcc2

思路

单调栈解决的问题单调栈解决的问题是在一个数组中想知道所有数中,
左边离他近的比他大的和右边离他近的比他大的数
思考的问题:如果知道所有数上得到上述要求,
同时复杂度满足O(N)。单调栈结构:单调栈内,从栈底到栈顶满足从大到小。
例如:5(0)4(1)3(2)6(3)后面括号代表所属位置原文链接:https://blog.csdn.net/qq_35065720/article/details/104211981

参考答案Java

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param nums int整型一维数组* @return int整型*/public int sumSubarr (ArrayList<Integer> ll) {int[] nums = new int[ll.size()];for (int i=0;i<ll.size();i++){nums[i] = ll.get(i);}//力扣同一道题://https://leetcode.cn/problems/sum-of-subarray-minimums/description/?utm_source=LCUS&utm_medium=ip_redirect&utm_campaign=transfer2china//单调栈int[] left = left(nums);int[] right = right(nums);long max = 0;for (int i = 0; i <nums.length ; i++) {//max +=nums[i]*(right[i]-left[i]+1);// max +=nums[i]*(right[i]-left[i]+1);int start = i-left[i];int end = right[i]-i;max+= start*end*(long)nums[i];max%=1000000007;}return (int) max;}public int[] left(int[] arr){//往左扩int n= arr.length;int[] ans = new int[n];Stack<Integer> stk = new Stack<>();for (int i = n-1; i >=0 ; i--) {while (!stk.isEmpty() && arr[stk.peek()] >= arr[i]){ans[stk.pop()] = i;}stk.add(i);}while (!stk.isEmpty()){ans[stk.pop()] = -1;}return  ans;}public int[] right(int[] arr){ //往右扩int n = arr.length;int[] ans = new int[n];Stack<Integer> stk = new Stack<>();for (int i = 0; i <n ; i++) {while (!stk.isEmpty() && arr[stk.peek()] > arr[i]){ans[stk.pop()] = i;}stk.add(i);}while (!stk.isEmpty()){ans[stk.pop()] = n;}return ans;}
}

参考答案Go

package main/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param nums int整型一维数组 * @return int整型
*/
func sumSubarr( nums []int ) int {//单调栈n := len(nums)left := left(nums)right := right(nums)ans := 0for i := 0; i < n; i++ {start := i - left[i]end := right[i] - ians += start * end * nums[i]ans %= 1000000007}return ans
}func left(arr []int) []int { //往左扩n := len(arr)ans := make([]int, n)stk := []int{}for i := n - 1; i >= 0; i-- {for len(stk) > 0 && arr[stk[len(stk)-1]] >= arr[i] {ans[stk[len(stk)-1]] = istk = stk[:len(stk)-1]}stk = append(stk, i)}for len(stk) != 0 {ans[stk[len(stk)-1]] = -1stk = stk[:len(stk)-1]}return ans
}func right(arr []int) []int { //往右扩n := len(arr)ans := make([]int, n)stk := []int{}for i := 0; i < n; i++ {for len(stk) != 0 && arr[stk[len(stk)-1]] > arr[i] {ans[stk[len(stk)-1]] = istk = stk[:len(stk)-1]}stk = append(stk, i)}for len(stk) != 0 {ans[stk[len(stk)-1]] = nstk = stk[:len(stk)-1]}return ans
}

参考答案PHP

<?php/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param nums int整型一维数组 * @return int整型*/
function sumSubarr( $nums )
{//单调栈$n = count($nums);$left = left($nums);$right = right($nums);$ans = 0;for($i=0;$i<$n;$i++){$start = $i-$left[$i];$end = $right[$i]-$i;$ans += $start*$end*$nums[$i];$ans %=1000000007;}return $ans;
}function left($arr){$n = count($arr);$ans = [];$s =[];for($i=$n-1;$i>=0;$i--){while ( count($s)!=0 && $arr[$s[count($s)-1]] >= $arr[$i]){$ans[array_pop($s)] = $i;}array_push($s,$i);}while ( count($s)!=0){$ans[array_pop($s)] = -1;}return $ans;
}function right($arr){$n = count($arr);$ans = [];$s =[];for($i=0;$i<$n;$i++){while ( count($s)!=0 && $arr[$s[ count($s)-1]] > $arr[$i]){$ans[array_pop($s)] = $i;}array_push($s,$i);}while ( count($s)!=0){$ans[array_pop($s)] = $n;}return $ans;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/624697.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web前端开发——Ajax,Axios概述及在Vue框架中的使用

前言&#xff1a; 整理下学习笔记&#xff0c;打好基础&#xff0c;daydayup!!! Ajax Ajax是什么&#xff1f; Ajax全称Asynchromous JavaScript And Xml&#xff0c;是异步的JavaScript和Xml。 Ajax的作用&#xff1f; 1&#xff0c;数据交换&#xff1a;通过Ajax可以给服务器…

使用undetected-chromedriver遇到的问题及解决方法,以及它使用SOCKS代理的问题

环境&#xff1a;python3.8.10 uc的安装方法&#xff1a; pip38 install undetected-chromedriver 上测试代码&#xff1a; import undetected_chromedriver as uc driver uc.Chrome() driver.get(https://www.baidu.com) driver.save_screenshot(baidu.png)报错&#xff…

Java项目如何使用EasyExcel插件对Excel数据进行导入导出

文章目录 一、EasyExcel的示例导入依赖创建实体类数据导入和导出 二、EasyExcel的作用三、EasyExcel的注解 EasyExcel是一个阿里巴巴开源的excel处理框架&#xff0c;它以使用简单、节省内存著称。在解析Excel时&#xff0c;EasyExcel没有将文件数据一次性全部加载到内存中&…

权限管理Ranger详解

文章目录 一、Ranger概述与安装1、Ranger概述1.1 Ranger介绍1.2 Ranger的目标1.3 Ranger支持的框架1.4 Ranger的架构1.5 Ranger的工作原理 2、Ranger安装2.1 创建系统用户和Kerberos主体2.2 数据库环境准备2.3 安装RangerAdmin2.4 启动RangerAdmin 二、Ranger简单使用1、安装 R…

python之flask安装以及使用

1 flask介绍 Flask是一个非常小的Python Web框架&#xff0c;被称为微型框架&#xff1b;只提供了一个稳健的核心&#xff0c;其他功能全部是通过扩展实现的&#xff1b;意思就是我们可以根据项目的需要量身定制&#xff0c;也意味着我们需要学习各种扩展库的使用。 2 python…

基于Echarts的超市销售可视化分析系统(数据+程序+论文

本论文旨在研究Python技术和ECharts可视化技术在超市销售数据分析系统中的应用。本系统通过对超市销售数据进行分析和可视化展示&#xff0c;帮助决策层更好地了解销售情况和趋势&#xff0c;进而做出更有针对性的决策。本系统主要包括数据处理、数据可视化和系统测试三个模块。…

Rust腐蚀服务器清档多教程

Rust腐蚀服务器清档多教程 大家好我是艾西&#xff0c;一个做服务器租用的网络架构师。上期教了大家怎么搭建服务器以及安装插件等那么随着大家自己架设服或是玩耍的时间肯定会有小伙伴想要去新增开区数量或是把原本的服务器进行一些调整等&#xff0c;那么今天主要聊的就是怎…

PTA图论的搜索题

目录 7-1 列出连通集 题目 输入格式: 输出格式: 输入样例: 输出样例: AC代码 7-2 六度空间 题目 输入格式: 输出格式: 输入样例: 输出样例: 思路 AC代码 7-3 地下迷宫探索 题目 输入格式: 输出格式: 输入样例1: 输出样例1: 输入样例2: 输出样例2: 思路 …

Flask Web 应用与 MongoDB 集成:用户登录和退出

在本文中&#xff0c;我们将探讨如何使用 Flask Web 框架和 MongoDB 数据库构建一个简单的 Web 应用。我们将使用 Flask-PyMongo 扩展来实现 MongoDB 集成&#xff0c;并使用 Flask-Login 扩展来处理用户认证。 1. 安装所需库 首先&#xff0c;我们需要安装 Flask、Flask-PyM…

在Qt中如何简单设计一个文件和图像浏览器

文本浏览器 设计一个文本浏览器程序&#xff0c;可以打开、显示 txt、html等文件。 1.在Qt Designer中设计一个菜单其中包含打开和退出选项&#xff1a; 2. 在 QMainWindow 构造函数中把 textBrower 设为主窗口的中心部件&#xff0c;这样整个窗口就成了包含 textBrower 的单文…

知道XRD标准品PDF卡片号,如何直接导出标准物质数据,简单快速一分钟完成(附jade下载安装方法)

知道XRD标准品PDF卡片号&#xff0c;如何直接导出标准物质数据&#xff08;附jade下载安装方法&#xff09; 网上找到的方法都是先检索再导出&#xff0c;我的样品根本检索不到&#xff0c;但是根据参考文献知道了自己的pdf卡片号&#xff0c;可通过jade直接导出数据 1.请安装…

WPF Extended.Wpf.Toolkit 加载界面

1、NuGet 中安装 Extended.Wpf.Toolkit 。 2、在MainWindow.xaml中添加xmlns:tk"http://schemas.xceed.com/wpf/xaml/toolkit" 。 MainWindow.xaml 代码如下。 <Window x:Class"WPF_Extended_Wpf_Toolkit_Loading.MainWindow" xmlns"ht…