牛客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 := 0
	for i := 0; i < n; i++ {
		start := i - left[i]
		end := right[i] - i
		ans += 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]] = i

			stk = stk[:len(stk)-1]
		}

		stk = append(stk, i)
	}

	for len(stk) != 0 {
		ans[stk[len(stk)-1]] = -1
		stk = 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]] = i
			stk = stk[:len(stk)-1]
		}
		stk = append(stk, i)
	}

	for len(stk) != 0 {
		ans[stk[len(stk)-1]] = n
		stk = 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.mfbz.cn/a/549073.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

移植speexdsp到OpenHarmony标准系统④

五、在OpenHarmony编译体系下增量编译Speexdsp 建议先增量编译生成三方库的动态链接库和可执行文件,验证是否成功把三方库加入OpenHarmonybian编译体系。 成功编译出so和可执行文件&#xff0c;即成功把三方库加入到ohos编译体系。之后还要验证三方库在ohos运行&#xff0c;功…

动态IP代理API的应用与优点

“动态”意味着每次连接或每隔一段时间&#xff0c;用户的IP地址都会发生改变。由于IP地址的不断变化&#xff0c;用户可以避免因频繁访问同一网站而导致的IP被封锁的问题。API叫做应用程序接口&#xff0c;是一种让软件之间相互通信的接口。API允许用户通过编程方式来调用动态…

单细胞RNA测序(scRNA-seq)cellranger count的细胞定量和aggr整合

单细胞RNA测序(scRNA-seq)基础知识可查看以下文章: 单细胞RNA测序(scRNA-seq)工作流程入门 单细胞RNA测序(scRNA-seq)细胞分离与扩增 单细胞RNA测序(scRNA-seq)SRA数据下载及fastq-dumq数据拆分 单细胞RNA测序(scRNA-seq)Cellranger流程入门和数据质控 细胞定量…

【C语言】每日一题,快速提升(2)!

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 题目&#xff1a;杨氏矩阵 有一个数字矩阵&#xff0c;矩阵的每行从左到右是递增的&#xff0c;矩阵从上到下是递增的&#xff0c;请编写程序在这样的矩阵中查找某个…

SpringCloud的使用以及五大核心组件

一、SpringCloud介绍 微服务架构的提出者&#xff1a;马丁福勒 https://martinfowler.com/articles/microservices.html // 微服务架构的提出者&#xff1a;马丁福勒&#xff08;中午网&#xff09; http://blog.cuicc.com/blog/2015/07/22/microservices/ 马丁.福勒对微服务…

住宅IP代理和数据中心/机房IP代理之间的区别

一、什么是数据中心/机房IP代理&#xff1f; 数据中心/机房IP代理是使用数据中心拥有并进行分配和管理的IP的代理&#xff0c;俗称机房IP代理。 二、数据中心/机房IP代理的特点 与住宅代理通过使用ISP拥有和分配的IP地址的设备路由请求的情况不同&#xff0c;数据中心代理利…

企业管理员工微信必备

在微信私域管理系统后台&#xff0c;管理员可以对销售工作微信进行实时监管&#xff0c;以确保业务员的微信使用符合工作要求&#xff0c;并避免资源的浪费。通过监管业务员在手机端微信的一举一动&#xff0c;包括发送会话的次数、接收消息的次数、添加好友的数据等&#xff0…

Kotlin从0到1,让你一周快速上手!!

声明 大家好&#xff0c;这里是懒羊羊学长&#xff0c;如果需要pdf版以及其他资料&#xff0c;请加入群聊。群里每天更新面经、求职资料&#xff0c;经验分享等&#xff0c;大家感兴趣可以加一下。 Kotlin 声明1.Kotlin基础2. Kotlin函数3.Kotlin进阶4.Kotlin集合5.Kotlin高…

更改ip地址的几种方式有哪些

在数字化时代&#xff0c;IP地址作为网络设备的标识&#xff0c;对于我们在网络世界中的活动至关重要。然而&#xff0c;出于多种原因&#xff0c;如保护隐私、访问特定网站或进行网络测试&#xff0c;我们可能需要更改IP地址。虎观代理将详细介绍IP地址的更改方法与步骤&#…

纯golang开发的mqtt server

Mochi-MQTT Server github地址&#xff1a;https://github.com/mochi-mqtt/server Mochi-MQTT 是一个完全兼容的、可嵌入的高性能 Go MQTT v5&#xff08;以及 v3.1.1&#xff09;中间件/服务器。 Mochi MQTT 是一个完全兼容 MQTT v5 的可嵌入的中间件/服务器&#xff0c;完…

使用colab进行yolov5小demo练习

输入一张动物的图片进行目标检测和分类 !pip install yolov5 import torch from PIL import Image from torchvision import transforms from yolov5.models.experimental import attempt_load from yolov5.utils.general import non_max_suppression# 加载YOLOv5模型 device …

PLC远程通信:实现工业自动化的关键技术

在当今高度信息化和自动化的时代&#xff0c;工业领域对于实时数据的准确传输和迅速响应提出了更高要求。而PLC(可编程逻辑控制器)远程通信技术&#xff0c;正是能够实现工业自动化的关键技术之一。 首先&#xff0c;我们需要了解PLC远程通信的原理。PLC作为一种专用计算机控制…

【HormonyOS4+NEXT】TypeScript基础语法详解

&#x1f64b;‍ 一日之际在于晨 ⭐本期内容&#xff1a;TypeScript基础语法详解 &#x1f3c6;系列专栏&#xff1a;鸿蒙HarmonyOS4NEXT&#xff1a;探索未来智能生态新纪元 文章目录 前言变量与类型函数类与接口类&#xff08;Class&#xff09;接口&#xff08;Interface&am…

SD-WAN企业组网:多样化的应用场景

随着企业网络环境的快速发展&#xff0c;SD-WAN技术正成为实现站点间网络互通的关键所在。它不仅支持企业站点对因特网、SaaS云应用和公有云等多种业务的高效访问&#xff0c;更能满足多样化的业务需求。深入探讨SD-WAN的组网应用场景&#xff0c;我们能够发现其广泛的适用性和…

免费打造个人专属的高颜值本地大模型AI助手,无限量使用 Ollama+LobeChat开源工具,在本地运行AI大模型,安全的和AI对话。

文章目录 1、安装ollama2、下载模型3、安装lobechat4、卸载Ollama 1、安装ollama 第一步&#xff0c;首先安装ollama&#xff0c;选择对应系统的安装包 ollama官网地址&#xff1a;https://ollama.com/ 本问是lunix系统上安装ollama&#xff1a; curl -fsSL https://ollama.…

Python对txt文本文件内容进行替换,以便通过Origin进行数据分析

因为要使用Origin进行数据分析&#xff0c;数据集为单行文本逗号隔开&#xff0c;无法直接复制粘贴到Origin中&#xff0c;故为此整理了一下代码&#xff0c;方便后续直接使用。 一、任务需求 有个1.txt文档文件里面是一行数据信息&#xff0c;要将其规整为每行一个数据&…

排序:冒泡排序,直接插入排序,简单选择排序,希尔排序,快速排序,堆排序,二路归并排序

目录 一.冒泡排序 代码如下 冒泡排序时间复杂度分析 二.直接插入排序 直接插入排序时间复杂度分析 直接插入排序优化&#xff1a;折半插入排序 三.简单选择排序 简单选择排序优化&#xff1a;双向选择排序 选择排序时间复杂度 双向选择排序时间复杂度 四.希尔排序 希…

Java反序列化基础-类的动态加载

类加载器&双亲委派 什么是类加载器 类加载器是一个负责加载器类的对象&#xff0c;用于实现类加载的过程中的加载这一步。每个Java类都有一个引用指向加载它的ClassLoader。而数组类是由JVM直接生成的&#xff08;数组类没有对应的二进制字节流&#xff09; 类加载器有哪…

贝锐蒲公英企业路由器X5 Pro:无需专线和IT人员,分钟级异地组网

尽管我们公司规模较小&#xff0c;只有十几个人&#xff0c;但为了确保项目资料的安全&#xff0c;依旧在公司内部自建了文件存储服务器和办公系统。 但是&#xff0c;随着项目数量的增加&#xff0c;大家出差办公的情况也愈发普遍&#xff0c;如何解决远程访问内部系统成了问…

公司聚会计划:最优宾客名单的算法设计与分析

公司聚会计划&#xff1a;最优宾客名单的算法设计与分析 问题描述算法设计C代码实现时间复杂度分析空间复杂度分析结论 在组织公司聚会时&#xff0c;一个重要的考虑因素是如何确保聚会的愉快氛围。在本问题中&#xff0c;公司主席希望在聚会上避免员工及其直接主管同时出席&am…
最新文章