程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 劍指OFFER之數組中出現次數超過一半的數字(九度OJ1370)

劍指OFFER之數組中出現次數超過一半的數字(九度OJ1370)

編輯:關於C語言

題目描述:

數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度為9的數組{1,2,3,2,2,2,5,4,2}。由於數字2在數組中出現了5次,超過數組長度的一半,因此輸出2。

 

輸入:

每個測試案例包括2行:

第一行輸入一個整數n(1<=n<=100000),表示數組中元素的個數。

第二行輸入n個整數,表示數組中的每個元素,這n個整數的范圍是[1,1000000000]。

 

輸出:

對應每個測試案例,輸出出現的次數超過數組長度的一半的數,如果沒有輸出-1。

 

樣例輸入:
9
1 2 3 2 2 2 5 4 2

 

樣例輸出:
2 

解題思路:

  有兩種思路。先說在這道題目上能成功的:

  我們首先對數組進行排序,因為要找出數目超過一半的數,因此,如果存在,那麼這個數組的中間值肯定是這個數。比如

  1 2 2 2 1 或者 1 1 2 2 2 或者 2 2 2 3 3,中間的肯定是我們要找的數。

  而如果不存在,那麼進行一次O(n)的掃描即可。因此我們的算法時間復雜度為快排+一次遍歷,O(nlogn)+O(n)。

快排的代碼如下:

void Qsort(int begin,int end){
    int middle;
    if(begin < end){
        middle = Patition(begin,end);

        Qsort(begin,middle -1);
        Qsort(middle+1,end);
    }
}
int Patition(int begin,int end){
    int middle = gArr[begin];
    while(begin < end){
        while(begin < end && gArr[end] >= middle)
            end--;
        swap(begin,end);

        while(begin < end && gArr[begin] <= middle)
            begin++;
        swap(begin,end);
    }
    return begin;
}
void swap(int begin,int end){
    int tmp = gArr[end];
    gArr[end] = gArr[begin];
    gArr[begin] = tmp;
}

全部代碼:

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100001
int gArr[MAXSIZE] = {0};
void Qsort(int begin,int end);
void swap(int begin,int end);
int Patition(int begin,int end);
int main(){
    int n,i,middle,count;
    while(scanf("%d",&n)!=EOF && n>0 && n <= 100000){
        for(i=0;i<n;i++){
            scanf("%d",&gArr[i]);
        }
        Qsort(0,n-1);
        middle = gArr[n/2];
        count = 0;
        for(i=0;i<n;i++){
            if(middle == gArr[i])
                count++;
        }
        if(count > n/2)
            printf("%d\n",middle);
        else
            printf("-1\n");
    }
}
void Qsort(int begin,int end){
    int middle;
    if(begin < end){
        middle = Patition(begin,end);
 
        Qsort(begin,middle -1);
        Qsort(middle+1,end);
    }
}
int Patition(int begin,int end){
    int middle = gArr[begin];
    while(begin < end){
        while(begin < end && gArr[end] >= middle)
            end--;
        swap(begin,end);
 
        while(begin < end && gArr[begin] <= middle)
            begin++;
        swap(begin,end);
    }
    return begin;
}
void swap(int begin,int end){
    int tmp = gArr[end];
    gArr[end] = gArr[begin];
    gArr[begin] = tmp;
}
 
/**************************************************************
    Problem: 1370
    User: xhalo
    Language: C
    Result: Accepted
    Time:800 ms
    Memory:1304 kb
****************************************************************/

 

另外一種思路

  我們對每個元素進行統計。但是在記錄統計時,有個麻煩處,就是如何從記錄數組中查找到我們要記錄的元素。下面的代碼在數據量很大,我猜測是100000個不重復的點,因此進行遍歷時超時了。不過在小數據量時,還是可以的:

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100000
typedef struct flag{
    int data;
    int counter;
}Flag;
typedef struct fArr{
    struct flag arr[MAXSIZE];
}FArr;
int gArr[MAXSIZE] = {0};
int gnum;
int main(){
    int n,i,max,maxNum;
    while(scanf("%d",&n)!=EOF && n>0 && n <= 100000){
        FArr *a = (FArr *)malloc(sizeof(FArr));
        gnum = 0;
        max = -1;
        maxNum = -1;
        for(i=0;i<n;i++){
            scanf("%d",&gArr[i]);
        }
        for(i=0;i<n;i++){
            int j = 0;
            while(j<gnum){
                if(a->arr[j].data == gArr[i])
                    break;
                j++;
            }
            if(gnum != 0 && j != gnum){
                a->arr[j].counter++;
            }else{
                a->arr[gnum].data = gArr[i];
                a->arr[gnum++].counter = 1;
            }
        }
        for(i=0;i<gnum;i++){
            if(max < a->arr[i].counter){
                max = a->arr[i].counter;
                maxNum = a->arr[i].data;
            }
        }
        if(max > n/2)
            printf("%d\n",maxNum);
        else
            printf("-1\n");
    }
}
/**************************************************************
    Problem: 1370
    User: xhalo
    Language: C
    Result: Time Limit Exceed
****************************************************************/

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved