尋找多數元素問題

問題:假如如今有一個序列,已知其中一個數的此書超過50%,請找出這個數。好比3311323中,出現次數超過50%的數是3 。java



方法1兩兩比較,分別記錄數字的出現次數,2for循環就能夠解決。時間複雜度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;  
    }
相關文章
相關標籤/搜索