28數組中出現次數超過一半的數字
阿新 • • 發佈:2017-12-14
一個 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數組中出現次數超過一半的數字