题目描述:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
测试样例:
例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
思路一(不推荐):
首先将容器中的数字排序,则排序结束后,相同的数字都在相邻位置,直接判断数组当前位置的数字与(数组位置+数组一半长度位置)的数字是否相等,相等则输出该数字。
代码:
时间复杂度O(nlogn),空间复杂度O(1)
import java.util.Arrays;
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
if(array == null || array.length <= 0)
return 0;
int len = array.length / 2;
Arrays.sort(array);
for(int i = 0; i + len < array.length;i++)
if(array[i] == array[i + len])
return array[i];
return 0;
}
}
Runtime:15ms
思路二:
首先是输入是数字,介于0~9之间(晕我居然才知道)。所以我们可以首先建立一个含有10个元素的数组,然后用输入的数字作为下标以统计每个数字出现的次数。再对这个数组与长度的一半进行比较,输出结果。
代码:
时间复杂度O(n),空间复杂度O(1)
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
if(array == null || array.length <= 0)
return 0;
int [] arr = new int [10];
int len = array.length / 2;
for(int i : array)
arr[i]++;
for(int j = 0;j < 10;j++)
if(arr[j] > len)
return j;
return 0;
}
}
Runtime:11ms
思路三:
如果有符合条件的数字,则它出现的次数比其他所有数字出现的次数和还要多。
在遍历数组时保存两个值:一是数组中一个数字,一个是次数。遍历下一个数字时,若它与之前保存的数字相同,则次数加1,否则次数减1;若次数为0,则保存下一个数字,并将次数置为1。遍历结束后,所保存的数字即为所求。然后再判断它是否符合条件即可。
代码:
时间复杂度O(n),空间复杂度O(1)
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
if(array == null || array.length <= 0)
return 0;
int len = array.length;
int times = 1, res = array[0];
// 遍历每个元素,并记录次数;若与前一个元素相同,则次数加1,否则次数减1
for(int i = 1; i < len; i++){
if(times == 0){
// 更新result的值为当前元素,并置次数为1
res = array[i];
times = 1;
}else if(array[i] == res)
times++;
else
times--;
}
times = 0;
for(int num : array)
if(num == res)
times++;
return (times > len / 2)? res : 0;
}
}
Runtime:17ms
思路四:
利用HashMap存储
代码
时间复杂度O(n),空间复杂度O(n)
import java.util.HashMap;
import java.util.Map;
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
if(array == null || array.length <= 0)
return 0;
HashMap <Integer,Integer> map = new HashMap <Integer,Integer>();
for(int i = 0;i < array.length;i++){
if(map.containsKey(array[i])){
map.put(array[i], map.get(array[i])+1);
}else{
map.put(array[i], 1);
}
}
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
if(entry.getValue() > array.length/2)
return entry.getKey();
}
return 0;
}
}
Runtime:12ms
------至所有正在努力奋斗的程序猿们!加油!!
有码走遍天下 无码寸步难行
1024 - 梦想,永不止步!
爱编程 不爱Bug
爱加班 不爱黑眼圈
固执 但不偏执
疯狂 但不疯癫
生活里的菜鸟
工作中的大神
身怀宝藏,一心憧憬星辰大海
追求极致,目标始于高山之巅
一群怀揣好奇,梦想改变世界的孩子
一群追日逐浪,正在改变世界的极客
你们用最美的语言,诠释着科技的力量
你们用极速的创新,引领着时代的变迁
——乐于分享,共同进步,欢迎补充
——Treat Warnings As Errors
——Any comments greatly appreciated
——Talking is cheap, show me the code
——诚心欢迎各位交流讨论!QQ:1138517609
——CSDN:https://blog.csdn.net/u011489043
——简书:https://www.jianshu.com/u/4968682d58d1
——GitHub:https://github.com/selfconzrr