flag
软件学院大三党,每天一道算法题,第33天
题目介绍
在一个给定的数组nums中,总是存在一个最大元素 。
查找数组中的最大元素是否至少是数组中每个其他数字的两倍。
如果是,则返回最大元素的索引,否则返回-1。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/largest-number-at-least-twice-of-others
思路
首先找到数组里最大的数字,并记下它的index
然后找到数组里第二大的数字:我们将数组中最大数字改成Integer.MinValue,这样遍历一次就能找到第二大的数字,相当于删除了最大数字
将最大数字与第二大数字的二倍进行比较
关键代码
public static int dominantIndex(int[] nums){
if(nums.length==1)
return 0;
int maxIndex=0;
int secondMaxNum=Integer.MIN_VALUE;
int maxNum=Integer.MIN_VALUE;
for(int i=0;i<nums.length;i++){
if(nums[i]>maxNum){
maxNum=nums[i];
maxIndex=i;
}
}
nums[maxIndex]=Integer.MIN_VALUE;
for(int i=0;i<nums.length;i++){
if(nums[i]>secondMaxNum){
secondMaxNum=nums[i];
}
}
if(secondMaxNum*2<=maxNum)
return maxIndex;
else return -1;
}
总结
这道题还是不要用排序了,因为完全可以在O(N)的时间复杂度完成,排序会增加时间复杂度。