【蓝桥Java每日一练】——7

🐤1.至少是其他数字两倍的最大数

=================

给你一个整数数组 nums ,其中总是存在 唯一的 一个最大整数 。

请你找出数组中的最大元素并检查它是否 至少是数组中每个其他数字的两倍 。如果是,则返回 最大元素的下标 ,否则返回 -1 。

题目链接:至少是其他数字两倍的最大数

题目分析:题目的要求非常简单,找出一个数组的最大值的下标即可,只不过这个最大值有一个限制条件,它**至少是数组中每个其他数字的两倍。**大家起码都是大学生了,这意思肯定能看懂吧,无非就是要求最大值最少都都得是次大值的两倍,所以我们遍历一遍数组,利用两个变量maxIndex1和maxIndex2去找到数组中的最大值下标和次大值下标就好啦。

遍历过程:

当我们循环判断nums[i]时,会有三种情况:

1.此时nums[i]>nums[maxIndex1],nums[maxIndex1]也就是最大值,那么说明找到了个更大的,我们把maxIndex1更新成i

2.此时nums[maxIndex1]>nums[i]>nums[maxIndex2],找到了个次大值,我们把maxIndex2更新为i

3.此时nums[i]<nums[maxIndex2],小于次大值,这个数对我们无意义,不处理

最后我们去判断nums[maxIndex1]>=2*nums[maxIndex2],如果满足我们就输出maxIndex1,否则输出-1

🐣1.易错情况1


上述的逻辑其实是有地方有错误的,不知道大家能否发现,因为根据上述的代码我们会写出如下的代码:

错误版本代码1:

class Solution {

public int dominantIndex(int[] nums) {

if(nums.length==1) return 0;

//1维护的是最大值下标,2维护的是次大值下标

int maxIndex1=0;

int maxIndex2=0;

for(int i=1;i<nums.length;i++){

if(nums[i]>nums[maxIndex1]){

maxIndex2=maxIndex1;

}else if(nums[i]>nums[maxIndex2]){

maxIndex2=i;

}

}

if(nums[maxIndex1]>=2*nums[maxIndex2]){

return maxIndex1;

}else{

return -1;

}

}

}

这样一写就发现连题目给的第二个用例就过不了:        为什么呢?明明4不是3的两倍,为什么还输出下标3呢?其实如果我们去眼睛debug一下,很容易就会发现一个问题——在情况1中,我们把maxIndex1更新为i,但是没有把maxIndex2更新为****maxIndex1。虽然maxIndex1它遇到了比他更大的,但它应该为次大,所以需要把maxIndex1赋值给maxIndex2。

🐣2.易错情况2

=================

如果照上面改正一定就没问题了吧,没错本来我也是这么想的,完善的代码如下:

错误版本2

class Solution {

public int dominantIndex(int[] nums) {

if(nums.length==1) return 0;

//1维护的是最大值下标,2维护的是次大值下标

int maxIndex1=0;

int maxIndex2=0;

for(int i=1;i<nums.length;i++){

if(nums[i]>nums[maxIndex1]){

maxIndex2=maxIndex1;

maxIndex1=i;

}else if(nums[i]>nums[maxIndex2]){

maxIndex2=i;

}

}

if(nums[maxIndex1]>=2*nums[maxIndex2]){

return maxIndex1;

}else{

return -1;

}

}

}

提交以后获得血红的提示:       其实当我一看到这个用例时,我就知道问题出在了哪!我的maxIndex1和maxIndex2起始下标都是0,可是如果num[0]是一个数组的最大元素,那么maxIndex2就不会更新,导致答案出错。我觉得这个还是比较难想到的,究其原因还是因为我的maxIndex1和maxIndex2不合理。但是我们也加一行代码给它强制改正,当nums[maxIndex2]遇到nums[1]比自己小的时候,把maxIndex2更新为1。

🐣3.正确答案版本


结合以上的经验,我们终于写出来AC的代码了:

class Solution {

public int dominantIndex(int[] nums) {

if(nums.length==1) return 0;

//1维护的是最大值下标,2维护的是次大值下标

int maxIndex1=0;

int maxIndex2=0;

for(int i=1;i<nums.length;i++){

if(i==1&&nums[i]<nums[maxIndex2]){

maxIndex2=i;

}

if(nums[i]>nums[maxIndex1]){

maxIndex2=maxIndex1;

maxIndex1=i;

}else if(nums[i]>nums[maxIndex2]){

maxIndex2=i;

}

}

if(nums[maxIndex1]>=2*nums[maxIndex2]){

return maxIndex1;

}else{

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值