劍指Offer 陣列中出現次數超過一半的數字

2021-08-25 22:14:14 字數 2192 閱讀 7890

陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。

思路1:首先我們相當的應該就是遍歷,判斷每個數出現的次數。即

雙層迴圈,判斷每個數出現的次數,如果有乙個數字出現次數超過一般的數字,則輸出。若遍歷完沒有找到,則輸出

0。時間複雜度為o(n^2)

思路2:

使用map

將資料存於

map,然後遍歷map, 找到value值超過一半的數字。

缺點:需要額外空間。

接下來介紹劍指offer中提到的兩種解法。

思路3:最直觀的做法是排序(快速排序/stl中的sort())後找中間的數即可,但時間複雜度為

o(nlgn)。最後遍歷一遍,判斷找到的 數是否是出現次數超過一半的數字。

思路4:陣列中出現次數超過一半的數字,如果存在,則這個數出現的次數肯定比其他數字出現總數多,所以易

定義兩個變數,從第乙個數開始找,並記錄第乙個數為

result

為需要找的數,它出現的次數初始化為

times=1;

以後只要找到和

result

相等的數

times++,

否則times-- .

當times等於0

的時候,改變

result等於當前指向的數,繼續找。最後遍歷一遍,判斷找到的 數是否是出現次數超過一半的數字。

這裡僅僅介紹後兩種實現方法。

1. 排序後找中位數(這裡可以使用快排自已查詢,也可以使用sort().stl中的演算法)

//方法1:基於快速排序

//partion要選擇乙個基準值

int partion(vector& number, int left, int right)

//end找下於

while(begin < end && number[end] >= key)

swap(number[begin], number[end]);

} swap(number[begin],number[right]);

return begin;

} int morethanhalfnum2(vectornumbers)

int middle = len/2;

int div = partion(numbers, 0,len-1);

int start = 0;

int end = len-1;

while(div != middle)

else

}int result = numbers[middle];

//檢查是否超過了一半

int count = 0;

for(int i=0; ilen/2)

}return 0;

}//方法2:stl中的sort

//使用sort

int morethanhalfnum1(vectornumbers)

sort(numbers.begin(), numbers.end());

int result = numbers[len/2];

int count = 0;

for(int i=0; ilen/2)

}return 0;

}

2. 定義兩個變數,這種方法不易想到,而且不易理解。但是需要記住的是陣列中出現次數超過一半的數字,如果存在,則這個數出現的次數肯定比其他數字出現總數多。

//陣列中出現次數超過一般的數字(定義兩個變數)

//方法2:利用陣列的特點進行求解

int morethanhalfnum_solution(vectornumbers)

int result = numbers[0];

int count = 1;

for(int i = 1; i < len; ++i)

else

count --;

} //檢查是否超過了一半

count = 0;

for(int i=0; ilen/2)

}return 0;

}

總結:陣列中出現次數超過的一半的數字,需要記住1. 這個數字出現的次數,肯定比其他總數多。2. 排序後,前部分的數字均為這個數字。基於以上兩點,可以相當最優方法進行求解。

劍指offer 陣列在排序陣列中出現的次數

記錄次數,直接用data.count k 也通過了。或者常規演算法,出現有序用二分查詢。class solution def getnumberofk self,data,k write code here if len data 0 return 0 count 0 low 0 high len ...

劍指offer第39 陣列中出現次數超過一半的數字

陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。coding utf 8 classsolution defmorethanhalfnum solution self numb...

劍指Offer 028陣列中出現次數超過一半的陣列

028陣列 現次數超過一半的陣列 題目 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列 現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0 方法 map統計法 思路 遍歷陣列,用map來記錄每個數出現的次數,最後再遍歷map查詢是...