至少是其他数字两倍的最大数

标签: 数组 排序

难度: Easy

给你一个整数数组 nums ,其中总是存在 唯一的 一个最大整数 。

请你找出数组中的最大元素并检查它是否 至少是数组中每个其他数字的两倍 。如果是,则返回 最大元素的下标 ,否则返回 -1

示例 1:

输入:nums = [3,6,1,0]
输出:1
解释:6 是最大的整数,对于数组中的其他整数,6 至少是数组中其他元素的两倍。6 的下标是 1 ,所以返回 1 。

示例 2:

输入:nums = [1,2,3,4]
输出:-1
解释:4 没有超过 3 的两倍大,所以返回 -1 。

提示:

  • 2 <= nums.length <= 50
  • 0 <= nums[i] <= 100
  • nums 中的最大元素是唯一的

Submission

运行时间: 23 ms

内存: 16.0 MB

class Solution:
    def dominantIndex(self, nums: List[int]) -> int:
        max=-1
        scmax=-1
        index=-1
        for i in range(0,len(nums)):
            if nums[i]>max:
                scmax=max
                max=nums[i]
                index=i
            elif nums[i]<max and nums[i]>scmax:
                scmax=nums[i]
        if max>=2*scmax:
            return index
        else:
            return -1                
                 

Explain

这个题解的思路是遍历一遍数组,同时记录最大值和第二大的值。在遍历过程中,如果当前元素大于最大值,就将原最大值更新为第二大的值,将当前元素更新为最大值,并记录最大值的下标。如果当前元素小于最大值但大于第二大的值,就将当前元素更新为第二大的值。遍历结束后,判断最大值是否大于等于第二大的值的两倍,如果是则返回最大值的下标,否则返回-1。

时间复杂度: O(n)

空间复杂度: O(1)

class Solution:
    def dominantIndex(self, nums: List[int]) -> int:
        max = -1 # 记录最大值
        scmax = -1 # 记录第二大的值 
        index = -1 # 记录最大值的下标
        for i in range(0, len(nums)):
            if nums[i] > max:
                scmax = max # 原最大值更新为第二大的值
                max = nums[i] # 更新最大值
                index = i # 记录最大值的下标
            elif nums[i] < max and nums[i] > scmax:
                scmax = nums[i] # 更新第二大的值
        if max >= 2 * scmax: # 判断最大值是否大于等于第二大的值的两倍
            return index # 如果是则返回最大值的下标
        else:
            return -1 # 否则返回-1

Explore

算法逻辑同样适用于所有元素都小于0的情况。算法中比较的是元素的相对大小,而不管它们的正负。因此,即使所有元素都是负数,最大的负数和第二大的负数依然能被正确识别。最后,算法会检查最大值是否至少是第二大值的两倍,这个逻辑对于负数也是有效的。

这种初始化方式会正确处理全为非负整数的数组。因为任何非负整数都大于-1,所以在第一次迭代中,最大值和第二大值将被数组中的实际值所更新。初始化为-1是为了确保即使数组中的值是0或者非常小的正数,这些值也可以被识别和更新。

算法确实考虑了第二大值为0的情况。在这种情况下,只要最大值非0,按照算法逻辑,最大值总是至少是第二大值(即0)的两倍。因此,对于 nums = [0, 0, 3],最大值3是第二大值0的无限倍,算法将返回最大值的下标。

当前算法在这种情况下不会更新第二大的值,因为它只有在当前元素小于最大值但大于第二大值时才更新第二大值。对于 nums = [2, 2, 1],第二次遇到2时,由于2等于当前的最大值,第二大值不会被更新。这可能不影响最终结果,因为最大值的判断逻辑依然正确,但在不同上下文中,如果需要明确区分第二大的值,可能需要调整逻辑。