1. 程式人生 > >28數組中出現次數超過一半的數字

28數組中出現次數超過一半的數字

一個 sort 指定 超過 style 遍歷數組 還要 array port

題目描述

數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度為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(cnt==0){
 6                 cnt=1;
 7                 val=a[i];
 8             }
 9             else if(val==a[i]) cnt++;
10 else cnt--; 11 } 12 for(int i=0;i<a.length;i++) 13 if(a[i]==val) cnt++; 14 return cnt>a.length/2?val:0; 15 } 16 }

28數組中出現次數超過一半的數字