In a given integer array nums
, there is always exactly one largest element.
Find whether the largest element in the array is at least twice as much as every other number in the array.
If it is, return the index of the largest element, otherwise return -1.
Example 1:
Input: nums = [3, 6, 1, 0] Output: 1 Explanation: 6 is the largest integer, and for every other number in the array x, 6 is more than twice as big as x. The index of value 6 is 1, so we return 1.
Example 2:
Input: nums = [1, 2, 3, 4] Output: -1 Explanation: 4 isn't at least as big as twice the value of 3, so we return -1.
Note:
nums
will have a length in the range[1, 50]
.- Every
nums[i]
will be an integer in the range[0, 99]
.
這道題讓我們找一個至少是其他數字兩倍的最大數字,那么我們想,首先明確的一點是這個要求的數字一定是數組中的最大數字,因為其是其他所有的數字的至少兩倍。然后就是,如果該數字是數組中第二大的數字至少兩倍的話,那么它一定是其他所有數字的至少兩倍,所以我們可以遍歷一次數組分別求出最大數字和第二大數字,然后判斷一下最大數字是否是第二大數字的兩倍即可,注意這里我們判斷兩倍的方法並不是直接相除,為了避免除以零的情況,我們采用減法,參見代碼如下:
解法一:
class Solution { public: int dominantIndex(vector<int>& nums) { int mx = INT_MIN, secondMx = INT_MIN, mxId = 0; for (int i = 0; i < nums.size(); ++i) { if (nums[i] > mx) { secondMx = mx; mx = nums[i]; mxId = i; } else if (nums[i] > secondMx) { secondMx = nums[i]; } } return (mx - secondMx >= secondMx) ? mxId : -1; } };
當然我們也可以使用更straightforward的方法,首先遍歷一遍數組找出最大數字,然后再遍歷一遍數組,驗證這個數字是否是其他數字的至少兩倍,參見代碼如下:
解法二:
class Solution { public: int dominantIndex(vector<int>& nums) { int mx = INT_MIN, mxId = 0; for (int i = 0; i < nums.size(); ++i) { if (mx < nums[i]) { mx = nums[i]; mxId = i; } } for (int num : nums) { if (mx != num && mx - num < num) return -1; } return mxId; } };