剑指offer每日一题算法题(java解法)
方便日后复习,从今天开始。
算法之行始于足下
[编程题]数组中出现次数超过一半的数字-- Java实现
------------------------------------------------------------------------------------------------------
题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
解题思路:
1.利用了集合删除元素,后面元素会自动往前移的特性.
2.如果和第一个比相等,就计数,但是删除当前位置,如果当前数字遍历完还没满足一半以上,就遍历下一个不同数字,一样再次遍历整个数组,但是数组中已经没有了之前遍历不满足条件的数字,这样的话遍历时间的复杂度会节省很多
import java.util.*;
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
ArrayList<Integer> list=new ArrayList<Integer>();
if(array.length==0) return 0;
if(array.length==1) return array[0];
int count=1;
int length=array.length;
for(int i=0;i<array.length;i++){
list.add(array[i]);
}
/* forEach(int a:list){
forEach(int b:list){
if(a==b) count++;
if(count>array.lengt/2) return 2;
else return 0;
}
}*/
for(int i=0;i<=list.size()-1;i++){//遍历整个集合
for(int j=1;j<list.size();j++){
//拿外层循环的首数字和和之后的数字比较
if(list.get(0)==list.get(j))
{
//相等就,初始为1,计数再加1,再清楚比较的那个相同数字的地址
count++;
list.remove(j);
//如果count计数到集合的一半以上就返回这个数字,也就是首数字
if(count>length/2)
{
return list.get(0);
}
//因为清楚了那个相同数字的地址,下一个数字会也就是j+1会变成j
//我们这时要遍历它就得还原j
--j;
}
//如果遍历数组到最后一个仍然没超过一半,就还原计数器,并且删除首数字
if(j==list.size()-1)
{
count=1;
list.remove(0);
}
}
}
return 0;
}
}