求解LeetCode题库第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 。

分析:

问题并不复杂,试过之后,才知道在寻找“同时满足 0 <= i < nums.length - 1 和 nums[i] <= nums[i + 1] ”的整数 i 时,如果从nums的左边向右寻找时,就会漏掉一部分处理元素,使得最后从nums中得不到的真正的最大整数,无法完成问题的求解,正确的做法是从nums的右端向左端开始寻找。

程序设计了一个函数hbone(nums),从nums的右端向左端寻找,如果找到满足条件的整数i,返回可以继续处理的标志Fasle和处理之后的nums,否则返回不能继续处理的标志True和没有处理的nums。

程序如下:

#在nums中从最右边向左查找
def hbone(nums):
    n=len(nums)
    temp=[]
    for i in range(1,n):
        if nums[-i]>=nums[-(i+1)]:
            temp.append(i)
            break
    if temp==[]:
        return True,nums
    else:
        i=temp[0]
        nums[-i]=nums[-i]+nums[-(i+1)]
        del nums[-(i+1)]
        return False,nums

nums=eval(input('nums='))
while True:
    a,b=hbone(nums)
    print(a,b)
    nums=b[:]
    if a:
        print(max(b))
        break

运行实例1

nums=[3,4,7,6,8,1,2]

False [3, 4, 7, 6, 8, 3]

False [3, 4, 7, 14, 3]

False [3, 4, 21, 3]

False [3, 25, 3]

False [28, 3]

True [28, 3]

28

运行实例2

nums=[2,3,7,9,3]

False [2, 3, 16, 3]

False [2, 19, 3]

False [21, 3]

True [21, 3]

21

运行实例3

nums=[5,3,2]

True [5, 3, 2]

5

感悟:

每一个问题都有出题者考查的点,不以题的难易确定题目的好坏,坚持必有进益。

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值