2789-合并后数组中的最大元素
给你一个下标从 0 开始、由正整数组成的数组 nums
。
你可以在数组上执行下述操作 任意 次:
- 选中一个同时满足
0 <= i < nums.length - 1
和nums[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
思路
从后往前遍历数组,设置一个迭代变量res,如果res>=nums[i],则迭代变量res+=nums[i],否则res=nums[i],在遍历过程中更新ans
这种遍历迭代的思路为什么是正确的呢?
- 因为在逆序遍历的过程中可以保证记录到每次连续合并的最大值
- res=nums[i]可以理解为每次连续合并的第一个数(最开始res=nums[n-1]),遍历过程中如果res>=nums[i],则res+=nums[i],这样可以保证每次连续合并的数的值尽可能大
- 当res<nums[i]时,res重置为nums[i] (即res又变为新一轮连续合并的第一个数)
代码
碎碎念:这短短的十几行代码是我这个菜鸡在比赛的时候坐牢近1h才想出来的,仅以此篇题解记录自己的菜鸡生涯
1 | class Solution { |
复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(1)
Comments