2024.3.14
- 题目来源
- 我的题解
- 方法一 贪心+倒序遍历
题目来源
力扣每日一题;题序:2789
我的题解
方法一 贪心+倒序遍历
个人思想:要想满足条件的基础上得到最大值,则需要贪心倒序遍历,从右往左只要满足条件就相加,不满足条件重新开始相加。感觉自己说不清楚,这里引用官方题解的说法。
官方说法:题目中的一次替换删除操作,其实是相当于将两个相邻并且非递减的数字进行求和合并。两个数字的和来替换掉原来的两个数字。而经过若干次这样的合并,整个数组的和是不变的。合并后数组中的每个元素,都是原数组的某个子数组的和,并且这些子数组拼接起来能构成整个原数组。为了使数组的最大值最大,可以贪心地做尽可能多的合并,直到整个数组都不能进行合并。合并的要求是后面的数字不小于前面的数字,就尽可能先合并靠后的数字,使其尽快能大,才能够合并前面的数字。
从后往前倒序遍历一次数组,依次比较两个相邻的元素,如果两个相邻的元素能够合并,就将其合并。如果不能合并,就继续往前判断。因为这样的操作流程,在比较过程中,靠后的数是所有操作流程可能性中能产生的最大值,而靠前的数,是所有操作流程可能性中能产生的最小值。如果在遍历过程中,比较的结果是不能合并,那么其他任何操作流程都无法合并这两个数。如果可以合并,那我们就贪心地合并,因为这样能使接下来的比较中,靠后的数字尽可能大。
时间复杂度:O(n)
空间复杂度:O(1)
public long maxArrayValue(int[] nums) {long res=nums[nums.length-1];for(int i=nums.length-2;i>=0;i--){res=nums[i]<=res?nums[i]+res:nums[i];}return res;
}
有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~