LeetCode:2789. 合并后数组中的最大元素(贪心 Java)

目录

[2789. 合并后数组中的最大元素](#2789. 合并后数组中的最大元素)

题目描述:

实现代码与解析:

贪心

原理思路:


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

题目描述:

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

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

  • 选中一个同时满足 0 <= i < nums.length - 1nums[i] <= nums[i + 1] 的整数 i 。将元素 nums[i + 1] 替换为 nums[i] + nums[i + 1] ,并从数组中删除元素 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 <= nums.length <= 105
  • 1 <= nums[i] <= 106

实现代码与解析:

贪心

java 复制代码
class Solution {
    public long maxArrayValue(int[] nums) {
        
        long res = 0;
        long  cur = 0;

        int n = nums.length;

        for (int i = n - 1; i >= 0; i--) {
            if (cur < nums[i]) {
                res = nums[i];
                cur = 0; // 重新开始计算
            }
            cur += nums[i];
        }

        return Math.max(res, cur);
    }
}

原理思路:

因为数组总和是不变的,想要获得最大值,那么就要尽可能的合并,条件中说右侧数大于左侧才能合并,那么我们就从后向前遍历,让右侧优先合并变大才能向前继续合并找到最大值。

如果遍历时,不能再合并,立即更新res为nums[i],因为如果不能合并,说明左侧的单个数已经大于右侧合并的数,那么必然右侧不是最大值,重新开始计算即可。

最后要把cur和res取一个最大值,进行最后的比较。

相关推荐
源码获取_wx:Fegn089514 分钟前
计算机毕业设计|基于springboot + vue景区管理系统(源码+数据库+文档)
java·vue.js·spring boot·后端·课程设计
李少兄21 分钟前
Git 忽略文件机制:.gitignore 与 .git/info/exclude
java·git·elasticsearch
☀Mark_LY30 分钟前
个人数据同步es小工具
java·elasticsearch
组合缺一43 分钟前
开发 Java MCP 就像写 Controller 一样简单,还支持 Java 8
java·人工智能·llm·solon·java8·mcp
tobias.b1 小时前
408真题解析-2010-9-数据结构-折半查找的比较次数
java·数据结构·算法·计算机考研·408真题解析
源代码•宸1 小时前
Leetcode—404. 左叶子之和【简单】
经验分享·后端·算法·leetcode·职场和发展·golang·dfs
WBluuue1 小时前
数据结构与算法:dp优化——优化尝试和状态设计
c++·算法·leetcode·动态规划
im_AMBER1 小时前
Leetcode 105 K 个一组翻转链表
数据结构·学习·算法·leetcode·链表
sin_hielo1 小时前
leetcode 1877
数据结构·算法·leetcode
睡不醒的kun2 小时前
定长滑动窗口-基础篇(2)
数据结构·c++·算法·leetcode·职场和发展·滑动窗口·定长滑动窗口