Leetcode.2789 合并后数组中的最大元素

news/2024/11/23 2:44:49/

题目链接

Leetcode.2789 合并后数组中的最大元素 rating : 1485

题目描述

给你一个下标从 0 0 0 开始、由正整数组成的数组 n u m s nums nums

你可以在数组上执行下述操作 任意 次:

  • 选中一个同时满足 0 ≤ i < n u m s . l e n g t h − 1 0 \leq i < nums.length - 1 0i<nums.length1 n u m s [ i ] ≤ n u m s [ i + 1 ] nums[i] \leq nums[i + 1] nums[i]nums[i+1] 的整数 i i i。将元素 n u m s [ i + 1 ] nums[i + 1] nums[i+1] 替换为 n u m s [ i ] + n u m s [ i + 1 ] nums[i] + nums[i + 1] nums[i]+nums[i+1] ,并从数组中删除元素 n u m s [ i ] nums[i] nums[i]

返回你可以从最终数组中获得的 最大 元素的值。

示例 1:

输入:nums = [2,3,7,9,3]
输出:21
解释:我们可以在数组上执行下述操作:

  • 选中 i = 0 ,得到数组 nums = [5,7,9,3] 。
  • 选中 i = 1 ,得到数组 nums = [5,16,3] 。
  • 选中 i = 0 ,得到数组 nums = [21,3] 。 最终数组中的最大元素是 21 。可以证明我们无法获得更大的元素。

示例 2:

输入:nums = [5,3,3]
输出:11
解释:我们可以在数组上执行下述操作:

  • 选中 i = 1 ,得到数组 nums = [5,6] 。
  • 选中 i = 0 ,得到数组 nums = [11] 。 最终数组中只有一个元素,即 11 。

提示:

  • 1 ≤ n u m s . l e n g t h ≤ 1 0 5 1 \leq nums.length \leq 10^5 1nums.length105
  • 1 ≤ n u m s [ i ] ≤ 1 0 6 1 \leq nums[i] \leq 10^6 1nums[i]106

解法:贪心

我们用 s s s 表示每一段能够合并的元素之和, s s s 初始为 n u m s [ n − 1 ] nums[n-1] nums[n1]

我们用 a n s ans ans 表示最大的元素值, a n s ans ans 初始为 n u m s [ n − 1 ] nums[n-1] nums[n1]

我们从逆序开始遍历 n u m s [ i ] ( 0 ≤ i ≤ n − 2 ) nums[i] \quad (0 \leq i \leq n - 2) nums[i](0in2)

  • 如果 s ≥ n u m s [ i ] s \geq nums[i] snums[i],说明 s s s 可以和 n u m s [ i ] nums[i] nums[i] 合并, s s s 合并之后的值为 s + n u m s [ i ] s + nums[i] s+nums[i]
  • 否则,说明 s s s 不可以和 n u m s [ i ] nums[i] nums[i] 合并,那么 s s s 就要以 n u m s [ i ] nums[i] nums[i] 开始合并,也就是 s = n u m s [ i ] s = nums[i] s=nums[i]

在遍历的过程中, a n s ans ans 取最大的 s u m sum sum,也就是最大的元素。

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

C++代码:

using LL = long long;class Solution {
public:long long maxArrayValue(vector<int>& nums) {int n = nums.size();LL ans = nums[n - 1] , s = nums[n - 1];for(int i = n - 2;i >= 0;i--){if(s >= nums[i]) s += nums[i];else s = nums[i];ans = max(ans , s);}return ans;}
};

http://www.ppmy.cn/news/1024944.html

相关文章

【React | 前端】在React的前端页面中,判断某个变量值是否被定义?根据是否定义显示不同的内容?

问题描述 在React的前端页面中&#xff0c;判断某个变量值是否被定义&#xff1f;根据是否定义显示不同的内容&#xff1f; 问题场景 假如&#xff0c;现在有一个需求是设计一个新功能&#xff0c;新功能中要求新增一个之前没有的变量&#xff0c;假设是计算某一个数组的长度…

微服务05-Sentinel流量防卫兵

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以 流量 为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 S…

什么是分布式系统,如何学习分布式系统

正文 虽然本人在前面也写过好几篇分布式系统相关的文章&#xff0c;主要包CAP理论&#xff0c;分布式储存与分布式事务&#xff0c;但对于分布式系统&#xff0c;并没有一个跟清晰的概念。分布式系统涉及到很多的技术、理论与协议&#xff0c;很多人也说&#xff0c;分布式系统…

go练习 day02

go中使用mongodb实现增删改查 连接mongodb yaml配置 mongodb:uri: mongodb://localhost:27017初始化连接 package confimport ("context""fmt""time""github.com/spf13/viper""go.mongodb.org/mongo-driver/mongo""…

gin的占位符:和通配符*

1、用法 在 Gin 路由中&#xff0c;可以使用一个通配符&#xff08;*&#xff09;或一个占位符&#xff08;:&#xff09;来捕获 URL 的一部分。 r.GET("/royal/:id", func(c *gin.Context) {id : c.Param("id")//fmt.Println("into :id")c.Str…

Day 27 C++ set/ multiset 容器,pair对组

文章目录 set容器&#xff08;集合&#xff09;基本概念定义特点set构造和赋值构造赋值总结示例 set大小和交换函数原型示例 set插入和删除函数原型示例 set查找和统计函数原型示例 set容器排序利用仿函数改变排序规则set存放自定义数据类型 multiset容器&#xff08;多重集合&…

CAD练习——绘制电风扇

注意要在三维空间内完成绘制 先绘制扇叶 两条射线确定角度 绘制圆弧&#xff08;圆修剪&#xff09; 绘制扇叶形状&#xff08;3点圆弧&#xff09; 圆角&#xff1a; 将这几段圆弧合成同一条多段线 换个立体视图 拉伸出厚度 绘制一个球 取二者交集&#xff08;带弧面的扇叶&a…

2023牛客暑期多校训练营8-I Make It Square

2023牛客暑期多校训练营8-I Make It Square https://ac.nowcoder.com/acm/contest/57362/I 文章目录 2023牛客暑期多校训练营8-I Make It Square题意解题思路代码实现 题意 解题思路 这里有两种情况&#xff0c;即 ∣ s ∣ > ∣ t ∣ |s|>|t| ∣s∣>∣t∣和 ∣ s ∣…