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.
提示:
nums 的长度范围在[1, 50].
每个 nums[i] 的整数范围在 [0, 100].
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/largest-number-at-least-twice-of-others
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
整体思路为:
题目可以简单的理解为寻找数组的第一大与第二大数。最终通过比较第一大第二大数结果确定返回值。
注意点:比较时是大于等于条件。
Solution1:2 次循环比较,有一个条件不满足时跳出内层循环
public int dominantIndex(int[] nums) {
int length = nums.length;
loop1:
for (int i = 0; i < length; i++) {
int tmp = nums[i] >> 1;
for (int i1 = 0; i1 < length; i1++) {
if (i1 != i && tmp < nums[i1]) {
continue loop1;// 不满足时跳出内层循环
}
}
// 内层循环结束后表示满足,此时直接返回下标
return i;
}
return -1;
}
Solution2:1 次循环比较,使用临时变量记录最大数
public int dominantIndex1(int[] nums) {
int max1 = 0; // 临时变量第一大数
int max2 = 0; // 临时变量第二大数
int max1Index = 0; // 临时变量第一大数对应数组下标
int length = nums.length;
for (int i = 0; i < length; i++) {
int num = nums[i];
if (num > max1) { // 交换变量
max2 = max1;
max1 = num;
max1Index = i;
} else if (num > max2) {
max2 = num;
}
}
return (max1 >> 1 >= max2) ? max1Index : -1; // 比较并返回下标
}