剑指offer 28:数组中出现次数超过一半的数字--- Java实现

剑指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;
        }
}
发布了52 篇原创文章 · 获赞 10 · 访问量 1527

猜你喜欢

转载自blog.csdn.net/jiohfgj/article/details/103173675