题目一(多数元素):
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
题目分析:
- 从所给数组中找出出现次数大于n/2的数字
- 因为是大于n/2的数字,所以只有一个符合要求的数字
- 懂得运用该题目的特性进行解题
题目解答:
- 方法一(依次遍历):
找出出现次数大于n/2的数字
建立两个指针,进行判断是否相等
若相等,则count++
若不等,进行下一个判断
最后判断长度是否大于n/2,并进行输出 - 方法二(利用题目)
从第一个数字开始count
如果与那个数字相同,视为1
若不同视为-1
最后对count的值进行判断
代码实现:
- 方法一(依次遍历):
//依次遍历,找出出现次数大于n/2的数字,只有一个符合要求的数字
int max=nums[0];
for(int i=0;i<nums.length;i++){
int count=1;
for(int j=i+1;j<nums.length;j++){
if(nums[i]==nums[j]){
max=nums[i];
count++;
}
}
if(count>(nums.length/2)){
return max;
}
}
- 方法二(利用多数元素的性质)
//利用题中性质,从一个数字开始count,如果与那个数字相同,则视为1,如果不同,则视为-1
//最后对count值进行计数判断
for(int i=0;i<nums.length;i++){
int count=1;
for(int j=0;j<nums.length;j++){
if(nums[i]==nums[j]){
count++;
}else{
count--;
}
}
if(count>0){
return nums[i];
}
}
return -1;
代码总结:
- 方法一:所占用的空间较大,且代码相比其他的方法过多,不推荐使用;
- 方法二:巧妙的运用了多数元素的性质(新思路)
题目二(至少是其他数字两倍的最大数):
在一个给定的数组nums中,总是存在一个最大元素 。
查找数组中的最大元素是否至少是数组中每个其他数字的两倍。
如果是,则返回最大元素的索引,否则返回-1
题目分析:
- 遍历找出数组中最大的数字
- 这个数字还需要是至少大于数组中其他元素两倍
题目解答:
- 利用指针找出最大的数字
- 并进行遍历判断,是否大于数组中其他数字的两倍
代码实现:
//找到最大值
int max=nums[0];
int a=0;
for(int i=1;i<nums.length;i++){
if(nums[i]>max){
max=nums[i];
a=i;
}
}
//对最大值进行判断
for(int i=0;i<nums.length;i++){
//对与max的值不同的进行判断
if(a!=i){
if(max<2*nums[i]){
return -1;
}
}
}
return a;
代码总结:
该题目较为简单,思路清晰且正确即可