题目:至少是其他数字两倍的最大数
在一个给定的数组nums中,总是存在一个最大元素 。
查找数组中的最大元素是否至少是数组中每个其他数字的两倍。
如果是,则返回最大元素的索引,否则返回-1。
思题思路:初看这个题,想到的是先扫描一遍数组,取出最大值和相应角标,再次扫描数组,用最大值和其他值进行比较。
class Solution {
public int dominantIndex(int[] nums) {
int max=nums[0];
int index=0;
for(int i=0;i<nums.length;i++){
if(nums[i]>max){
max=nums[i];
index=i;
}
}
for(int i=0;i<nums.length;i++){
if(nums[i]!=max&&max<(2*nums[i])){
return -1;
}
}
return index;
}
}
这思路可行,但是时间复杂度较高。可以做,但没必要,仔细想想,为什么要将最大值和所有元素进行比较呢?可以找到第二大元素,将其值的2倍与最大值进行比较,便可以证明最大值是否大于其余所有元素的2倍。
代码实现:
class Solution {
public int dominantIndex(int[] nums) {
if(nums.length==1){
return 0;
}
int max=0; //最大的数
int index=0; //最大数的角标
int secondMax=1; //第二大数
for(int i=0;i<nums.length;i++){ //遍历
if(nums[i]>max){ //比较,取最大值
secondMax=max; //每次循环,先将max的值给secondMax
max=nums[i]; //
index=i;
}else if(nums[i]>secondMax){
secondMax=nums[i];
}
}
return max>=(secondMax*2)? index:-1;
}
}
代码解析:每次循环,先将最大值的值给第二大值,之后再将最大值与其他元素比较,当max取到数组的最大值时,secondMax就取到了max的前一个值,即第二大值,最后三目运算返回结果。