一道脑筋急转弯
问题描述
在一个给定的数组nums中,总是存在一个最大元素 。查找数组中的最大元素是否至少是数组中每个其他数字的两倍。如果是,则返回最大元素的索引,否则返回 -1
来源:力扣(LeetCode)
示例:
输入: nums = [3,6,1,0]
输出: 1
解释: 6是最大的整数,对于数组中其他整数,6大于其他元素的两倍。6的索引是1,所以我们返回1。
解决方案
如果要解决这个问题,我们先要读懂题目要求,首先题目说查找数组中的最大元素是否至少是数组中每个其他数字的两倍。重点注意这个其他,这说明我们找的元素只能和数组中除了最大整数以外的其他整数比较,如果我们的最大整数需要比其余所有元素的两倍大,那只需要找到数组中第二大的元素来进行比较就可以了。现在就有两种思路,第一种就是用排序方法来找出第二大的元素,这种方法需要注意比较的时候转化为整数的形式。
首先我们用max函数找出数组中最大的整数,便于之后的比较。然后就是一个难点了,如果数组的长度小于2,那我们在取第二大元素的时候会报错,因为一共只有一个元素,所以先要进行一次数组长度判断,如果只有一个元素在里边,那么返回的就必然是0,如果不是这种特殊情况,再正常将最大整数和第二大整数进行比较。最后使用index()来获取下标。
第一种方法代码如下:
代码语言:javascript复制
class Solution:
def dominantIndex(self, nums: List[int]) -> int:
num1 = max(nums)#数组中最大的那个整数
if len(nums)<2:
return 0
else:
if num1 >= (2 * int(sorted(nums)[-2])):
return nums.index(num1)
else:
return -1
第二种方法就是将nums中的最大整数移除,再使用max()函数取出第二大元素进行比较,这种方法需要注意的是,移除后的数组不可以再进行取下标的操作,需要重新建立完整的列表。其余步骤和第一种相同。
代码语言:javascript复制class Solution:
def dominantIndex(self, nums: List[int]) -> int:
num1 = max(nums)
l = []
for i in nums:
l.append(i)
if len(nums)<2:
return 0
else:
nums.remove(num1)
num2 = max(nums)
if num1 >= (2 * int(num2)):
return l.index(num1)#要使用未进行删除过的列表
else:
return -1
结语
本题的难点是读懂题目要求,一般这些题都有很多很特殊的测试用例,所以一定要读懂题目要求,再进行严谨的编写。