1. 程式人生 > >陣列中出現超過一半的數(複雜度O(n))

陣列中出現超過一半的數(複雜度O(n))

題目描述

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

解題思路

對於這個題,複雜度為 O(nlogn)O(n*logn) 的當然很簡單了,將陣列排序,取中間那個數,然後判斷一下就行了。那麼顯然我們可以繼續優化,要求條件是數字出現次數超過陣列長度一半,換句話說就是,這個數字出現的次數比其它所有數字加起來出現的次數還多。那麼我們根據這個進行撕烤,我們首先將第一個數看作是我們要求的數字即 tmp = numbers[0], cnt = 1

,其中 tmptmp表示最後結果,cntcnt 表示個數,那麼如果碰到下一個數,如果和 tmptmp 相等,那麼 cnt++, 否則 cnt--, 顯然當 cnt = 0 的時候,我們更新 tmptmp 為當前比較的數字,掃完一遍後,最後,我們判斷 tmptmp 是否符合條件,如果符合條件,返回 tmptmp, 否則返回 00

程式碼如下

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        int n = numbers.size
(); if(n == 0) return 0; int tmp = numbers[0], cnt = 1; for(int i=1; i<n; i++) { if(cnt == 0) { tmp = numbers[i]; cnt = 1; continue; } if(numbers[i] == tmp) cnt++; else cnt--; }
cnt = 0; for(int i=0; i<n; i++) { if(numbers[i] == tmp) cnt++; } if(cnt > n/2) return tmp; return 0; } };

相關推薦

陣列出現超過一半的數複雜O(n)

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

查詢陣列重複的唯一元素+時間複雜On+空間複雜O1

這是我BIGO前端面試時,面試官給我出的一道題,題目是長度為N的陣列,元素大小範圍在[1,N-1],只有一個重複的元素,用O(n)的時間複雜度和O(1)的空間複雜度找出來這個重複的元素, 大致思路 1、因為總共有N個數,每個數的範圍是1到N-1,只有一個重複的數,所以這些數肯定是連續的           2

找出大陣列array第k大的元素要求時間複雜O(n)

具體的程式碼實現:import java.util.Stack; /** * @author wuwh * @date createTime:2016年3月6日 上午12:23:14 */ public class KthBiggest { public static

js刪除陣列的某元素無下標時

1、使用filter陣列去重; var arr1 = [1,2,3,4,5,6];//待運算元組 var j = 2;//待刪除元素 var noRepeat = function(arr1,arr2){ return arr1.flter(function(e){ re

快速冪和矩陣快速冪複雜Olog(n)C++實現

快速冪 快速冪顧名思義,就是快速算某個數的多少次冪。其時間複雜度為 O(log₂N), 與樸素的O(N)相比效率有了極大的提高。 快速冪實現原理 快速冪的原理比較好懂,就是說假如我們求的是3^11,其實比較通用的辦法就是 for 1:11 a*=3; 時間複雜

劍指offer(二十,二十,二十二)包含min函式的棧,字串的排列,陣列出現超過一半的數字

20:包含min函式的棧 題目描述 定義棧的資料結構,請在該型別中實現一個能夠得到棧最小元素的min函式。 感覺題目很無聊。。。我大js做這題就是方便,也讓我深刻意識到相對其他語言js繼承的強大性和靈活性。。。 var stack = []; function push(node) { stack

劍指offer:陣列出現超過次數超過一半的數字python實現

題目描述 陣列中有一個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入一個長度為9的陣列{1,2,3,2,2,2,5,4,2}。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。 思路1:用字典的鍵值對實現,鍵存放陣列中的數字,值

陣列出現次的數字,時間複雜O(n),空間複雜O(1)的解法

題目:一個整型數組裡除了兩個陣列外,其他的數字都出現了兩次,要找出這兩個數字。      異或運算有一個性質:任何數異或它自己,結果都是0;這樣如果題目變成只有一個數字只出現一次,其他數字均出現兩次,這樣我們從頭到尾異或陣列中的每一個數字,那麼最終的結果就是隻出現一次的數字

統計一個數字在排序陣列出現的次數。牛客劍指offer

題目描述: 統計一個數字在排序陣列中出現的次數 class Solution { public:     int GetNumberOfK(vector<int> data ,int k) {     } };  Solu

陣列去重時間複雜nlgn,時間複雜o(1)

public static void quickSort(int[] numArr, int left, int right) { //如果left等於right,即陣列只有一個元素,直接返回 if (left >= right) { return;

【劍指offer】陣列的逆序對校正書上錯誤【歸併排序】

題目描述 在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸出P%1000000007 題目保證輸入的陣列中沒有的相同的數字 資料範圍:

資料結構——陣列5找出陣列唯一重複的數元素範圍1~1000

這個題目本身就有一定侷限性。比如,對於陣列a[10001],其中,1000個數就是1~1000的每個數,可以任意排列,然後再多一個重複的數。題目就是怎麼求出這個特殊的重複的數。 這一類問題的解決思路主要有以下幾種: 方法一:先求和,再相減。即陣列元素值求和,

js查詢陣列是否存在某個值some函式indexOf函式

一、some方法some() 方法會依次執行陣列的每個元素:如果有一個元素滿足條件,則表示式返回true , 剩餘的元素不會再執行檢測。如果沒有滿足條件的元素,則返回false。注意: some() 不會對空陣列進行檢測。注意: some() 不會改變原始陣列。 var

Morris遍歷詳解——二叉樹先序序後序遍歷 時間複雜O(N),空間複雜O(1)

Morris二叉樹遍歷: 來到當前的節點:Cur 如果Cur無左孩子,Cur向右移動 (Cur = Cur.right) 如果Cur有左孩子,找到Cur左子樹上最右的節點,記為 mostright

找出二維陣列的最長路徑最長連結串列

一個二維陣列 比如 1    2   3   4    5 16 17 18 19  6 15 24 25 20  7 14 23 22 21  8 13 12 11 10  9 找出其中的最長路徑,每次只能向值比自己小的方向走,且每次只能向上或者向右走。 如24為起點:2

判斷陣列是否有重複數字two ways +位運算

//判斷陣列中是否有重複的數字,有則返回true,沒有則返回false //方法一:先用時間複雜度為O(nlogn)的排序將陣列重建,然後遍歷尋找 //方法二:新建一個數組型hash表,key存num[i],valu存num[i]出現的次數。時間複雜度為O(n),空間

php多維陣列的去重針對任意的鍵值進行去重--二維陣列的唯一--時間複雜~O(n)

以二維陣列為例,來說明針對任意鍵值的去重,時間複雜度為~O(n),只用一個foreach迴圈: <?php $arr = array( '0'=>array(

尋找主元素演算法時間複雜O(N),C#)

主元素問題:大小為N的陣列A,其主要元素是一個出現次數超過N/2的元素。 最近在學習演算法,書上發現這樣一道題,並且提供了一種遞迴演算法的概要,但是感覺不是特別好(遞迴判斷(時間複雜度大於O(N)了),還要對N的奇偶做出判斷以及使用附加陣列B),網上看了一下有一個SEO排行最靠前的(不說名字了,

把兩個有序數組合併成一個有序陣列,演算法複雜O(N)

/** * */ /** * @author jueying: * @version 建立時間:2018-10-22 下午01:32:44 * 類說明 */ /** * @author jueying * */ public class Test4 {

BFPRT演算法:時間複雜O(n)求第k小的數字分治演算法+快排

去年寫了一篇《分治演算法 求第 k k k小元素