牛客網--陣列中出現次數超過一半的數字
阿新 • • 發佈:2018-12-15
題目描述 陣列中有一個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入一個長度為9的陣列{1,2,3,2,2,2,5,4,2}。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。
這道題我記得可以用某種O(n)方法很巧妙,但是忘了,只好用笨的方法
package 劍指offer; import java.util.HashMap; /** * Created by Administrator on 2018/10/12. */ public class 陣列中出現次數超過一半的數字 { public int MoreThanHalfNum_Solution(int [] array) { HashMap<Integer,Integer> map=new HashMap<>(); for(int i=0;i<array.length;i++){ if(map.getOrDefault(array[i],0)+1>array.length/2){ return array[i]; }else{ map.put(array[i],map.getOrDefault(array[i],0)+1); } } return 0; } }
貼一下別人的程式碼,主要是利用結果數字超過陣列長度一半的特點,儲存兩個值,即一個是陣列中的一個數字,一個是次數 當我們遍歷到下一個數字的時候,
如果下一個數字和當前我們儲存的數字相同,則次數加 1;
如果和當前我們儲存的數字不同,則次數減 1;
當次數減到 0 的時候,我們將儲存的數字改為當前遍歷所處的位置,並將次數更改為 1。
int MoreThanHalfNum(int *arr, int len) { int result = arr[0]; int count = 1; for(int i = 1; i < len; ++i) { if(arr[i] == result) count ++; else if(count == 0) { result = arr[i]; count = 1; } else count --; } return result; } int main(int argc, char *argv[]) { int arr[5] = {1, 0, 1, 2, 1}; int num = MoreThanHalfNum(arr, 5); printf("The num is: %d\n", num); return 0; }