【LeetCode】第747题——至少是其他数字两倍的最大数(难度:简单)

【LeetCode】第747题——至少是其他数字两倍的最大数(难度:简单)

题目描述

在一个给定的数组nums中,总是存在一个最大元素 。

查找数组中的最大元素是否至少是数组中每个其他数字的两倍。

如果是,则返回最大元素的索引,否则返回-1。

  1. 示例 1:
    输入: nums = [3, 6, 1, 0]
    输出: 1
    解释: 6是最大的整数, 对于数组中的其他整数,
    6大于数组中其他元素的两倍。6的索引是1, 所以我们返回1.

  2. 示例 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

nums的长度为1时,由于没有其它数字,所以也算是至少是其他数字的两倍,返回下标0

nums的长度大于1时,引入第一大数字max1、第二大数字max2(max1是可能等于max2的)和第一大数字下标index,nums[0]和nums[1]的元素按大小放入max1和max2中(index也需同步赋值),从数组下标2开始往后遍历,遍历时只需考虑两种情况

  • 当前数字大于等于max1:把max1赋值给max2,再把当前数字赋值给max1,当前下标赋值给index
  • 不满足上一条件时,若当前数字大于max2:把当前数字赋值给max2即可

最后若max1大于等于max2的2倍,则返回index,否则返回-1

代码详解

class Solution {
    public int dominantIndex(int[] nums) {
        if(nums.length == 1) {
            return 0; // 一个元素时返回下标0
        }
        int max1 = 0;  // 第一大数字
        int max2 = 0;  // 第二大数字,是可能等于第一大数字的
        int index = 0; // 第一大数字的下标
        // 先对下标为0和1的进行初步处理
        if(nums[0] >= nums[1]) {
            max1 = nums[0];
            max2 = nums[1];
        } else {
            max1 = nums[1];
            max2 = nums[0];
            index = 1;
        }
        // 之后的循环从下标为2的元素开始即可
        for(int i = 2; i < nums.length; ++i) {
            if(nums[i] >= max1) { // 注意是大于等于
                max2 = max1;
                max1 = nums[i];
                index = i; // 记录第一大数字的下标
            } else if(nums[i] > max2) {
                max2 = nums[i];
            }
        }
        if(max1 >= (max2 * 2)) {
            return index;
        } else {
            return -1;
        }
    }
}

注意点

  1. 注意数组长度为1时的特殊情况
  2. 本方法已考虑到第一大数字和第二大数字一样的情况,此时第一大数字小于第二大数字的两倍,因此仍可返回-1
  3. 题目给出每个 nums[i] 的整数范围在 [0, 100],若整数范围是int类型的正数的话,还需考虑越界问题
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值