問題:假如如今有一個序列,已知其中一個數的此書超過50%,請找出這個數。好比3、3、1、1、3、2、3中,出現次數超過50%的數是3 。java
方法1:兩兩比較,分別記錄數字的出現次數,2個for循環就能夠解決。時間複雜度O(N^2)。ide
方法2:排序後,若是這個數出現的次數大於50%的話,排序以後就應該就是位於n/2位置的那個數。spa
方法3:「尋找多元素問題」,咱們很容易的看出來,在一個序列中若是去掉2個不一樣的元素,那麼原序列中的出現次數超過50%的數,在新的序列中仍是超過50%,所以咱們只要按照序列依次掃描,先把A[0]賦值給c,增長個計數器,count = 1;而後向右掃描,若是跟c相同,則count++,不一樣,那麼count --,這個真是咱們從上面那個結論裏得出的,一旦count == 0了,把c賦值爲A[i+1],count = 1;,重複該過程,直到結束,這個時候,c就是那個超過50%的數。遍歷一遍,時間複雜度爲O(N)。
orm
package candidate; public class Candidate { // 遞歸實現 public int candidateSort(int[]a, int start, int end) { int c = a[start]; int count = 1; int j; for (j=start;j<end && count>0;j++) { if (c == a[j]) { count++; } else { count--; } } if (j == end) { return c; } else { return candidateSort(a, j+1, end); } } // 循環實現 public int candidateSort(int[] a) { int c = a[0]; int count = 0; for (int i=1; i<a.length;i++) { if (c == a[i]) { count++; } else if (count < 0) { c = a[i]; count = 0; } else { count--; } } return c; }