Track the largest and second-largest values plus the largest value's index in a single pass, then compare the two maxima.
Complexity
O(n) time and O(1) extra space.
Return the index of the largest number when it is at least twice every other value.
Track the largest and second-largest values plus the largest value's index in a single pass, then compare the two maxima.
O(n) time and O(1) extra space.
package main
func dominantIndex(nums []int) int {
largest, second, largestIndex := -1, -1, -1
for index, value := range nums {
if value > largest {
second, largest, largestIndex = largest, value, index
} else if value > second {
second = value
}
}
if largest >= 2*second {
return largestIndex
}
return -1
}
class Solution:
def dominantIndex(self, nums: list[int]) -> int:
largest = second = largest_index = -1
for index, value in enumerate(nums):
if value > largest: second, largest, largest_index = largest, value, index
elif value > second: second = value
return largest_index if largest >= 2 * second else -1
function dominantIndex(nums: number[]): number {
let largest = -1;
let second = -1;
let largestIndex = -1;
nums.forEach((value, index) => { if (value > largest) { second = largest; largest = value; largestIndex = index; } else if (value > second) second = value; });
return largest >= 2 * second ? largestIndex : -1;
}