开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第31天,点击查看活动详情
一、题目描述:
747. 至少是其他数字两倍的最大数 - 力扣(LeetCode)
给你一个整数数组 nums
,其中总是存在 唯一的 一个最大整数 。
请你找出数组中的最大元素并检查它是否 至少是数组中每个其他数字的两倍 。如果是,则返回 最大元素的下标 ,否则返回 -1 。
示例 1:
输入:nums = [3,6,1,0]
输出:1
解释:6 是最大的整数,对于数组中的其他整数,6 至少是数组中其他元素的两倍。6 的下标是 1 ,所以返回 1 。
示例 2:
输入:nums = [1,2,3,4]
输出:-1
解释:4 没有超过 3 的两倍大,所以返回 -1 。
示例 3:
输入:nums = [1]
输出:0
解释:因为不存在其他数字,所以认为现有数字 1 至少是其他数字的两倍。
提示:
- 1 <= nums.length <= 50
- 0 <= nums[i] <= 100
- nums 中的最大元素是唯一的
二、思路分析:
建立结果 2 × 2 数组 set,第一第二行分别为次大和最大元素的值和坐标,并将初值和坐标初始化为 Golang 所容许的最小 64 位整数值 math.MinInt64 和 0。
- 逐个遍历 nums;
- 如果当前值 x 小于最大值 set[1][0] 且大于次小值 set[0][0],则更新次小值为 []int{x, index};
- 如果当前值 x 大于最大值 set[1][0],则最大值需更新为 []int{x, index},次小值更新为此前最大值;
- 循环结束后若最大值为最小值的 2 倍,则返回最大值的坐标 set[1][1],否则返回 -1。
三、AC 代码:
func dominantIndex(nums []int) int {
set := [][]int{{math.MinInt64, 0}, {math.MinInt64, 0}}
for index, x := range nums {
if set[0][0] < x && x < set[1][0] {
set[0] = []int{x, index}
} else if x > set[1][0] {
set[0], set[1] = set[1], []int{x, index}
}
}
if set[1][0] >= set[0][0]*2 {
return set[1][1]
}
return -1
}