zoukankan      html  css  js  c++  java
  • 28数组中出现次数超过一半的数字

    题目描述

    数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

    思路1:时间复杂度 nlogn
    先排序。
    如果符合条件的话,那个数一定是在数组的中间位置。
    还要判断 等于中间位置的数出现的次数是不是大于数组长度的一半。

     1 import java.util.Arrays;
     2 public class Solution {
     3     public int MoreThanHalfNum_Solution(int [] array) {
     4         Arrays.sort(array);
     5         for(int i=array.length/4;i<array.length*3/4;i++)
     6             if(array[i]!=array[array.length/2])
     7                 return 0;
     8         return array[array.length/2];
     9     }
    10     
    11 }

    思路2:0(N)

    数组中有一个数字出现的次数超过数组长度的一半,也就是说它出现的次数比其他所有数字出现的次数还要多。因此我们遍历数组的时候保存2个值,一个是数组中的一个数字,
    一个是次数。当我们遍历到下个数字的时候,如果与当前的数字相同, 次数加一,如果不同,次数减一。当次数变成0 的时候,重新指定一个数字。

     1 public class Solution {
     2     public int MoreThanHalfNum_Solution(int [] a) {
     3         int val=a[0],cnt=1;
     4         for(int i=1;i<a.length;i++){  
     5             if(val!=a[i]){
     6                 cnt--;
     7                 if(cnt==0){
     8                     cnt =1 ;
     9                     val = a[i];
    10                 }
    11             }
    12             else cnt++;
    13         }
    14         cnt = 0;
    15         for(int i=0;i<a.length;i++)
    16             if(a[i]==val) cnt++;
    17         return cnt>a.length/2?val:0;
    18     }
    19 }
  • 相关阅读:
    希腊字母写法
    The ASP.NET MVC request processing line
    lambda aggregation
    UVA 10763 Foreign Exchange
    UVA 10624 Super Number
    UVA 10041 Vito's Family
    UVA 10340 All in All
    UVA 10026 Shoemaker's Problem
    HDU 3683 Gomoku
    UVA 11210 Chinese Mahjong
  • 原文地址:https://www.cnblogs.com/zle1992/p/8035529.html
Copyright © 2011-2022 走看看