劍指offer28:找出數組中超過一半的數字。

来源:https://www.cnblogs.com/wxwhnu/archive/2019/08/27/11415849.html
-Advertisement-
Play Games

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


1 題目描述

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

2 思路和方法

  (1) 哈希表

  用哈希表記錄每個元素出現的次數,如果該元素出現次數超過一半,返回1,時間複雜度O(n),空間複雜度O(n)。m[numbers[i]]+=1map<int, int> m;

  (2) 排序

  先排序,取中間的數,若這個數在數組中出現超過長度一半,則存在;否則不存在時間複雜度O(nlogn)排序;空間複雜度O(1).

  (3) 查找中位數 O(n)

  基於partiton函數 O(n),如果存在:該數出現次數超過一半,排序第2/n個元素是該元素;即為中位數

3 C++核心代碼

(1)哈希表 m[numbers[i]]+=1map<intint> m;

 1 class Solution {
 2 public:
 3     int MoreThanHalfNum_Solution(vector<int> numbers) {
 4         // 哈希表存儲某個數出現的次數 hash查詢時間複雜度O(1);總時間複雜度O(n)
 5         map<int, int> m;
 6         for (int i = 0; i < numbers.size(); ++i) {
 7             m[numbers[i]]+=1;
 8             if(m[numbers[i]]>numbers.size()/2)
 9                 return numbers[i];
10         }
11         return 0;
12     }
13 };
View Code

(2) 排序

 1 class Solution {
 2 public:
 3     int MoreThanHalfNum_Solution(vector<int> numbers) {
 4         sort(numbers.begin(),numbers.end());
 5         int key = numbers[numbers.size()/2];
 6         int count = 0;
 7         for (int i = 0; i < numbers.size(); ++i) {
 8             if(key == numbers[i])
 9                 ++ count;
10         }
11         if (count>numbers.size()/2)
12             return key;
13         return 0;
14     }
15 };
View Code

(3)  查找中位數 O(n)——完整代碼

 1 #include <iostream>
 2 int Partition(int A[], int low, int high)
 3 {
 4     int pivot = A[low];
 5     while (low <high)
 6     {
 7         while (low<high && A[high] >= pivot) --high;
 8         A[low] = A[high];
 9         while (low<high && A[low] <= pivot) ++low;
10         A[high] = A[low];
11     }
12     A[low] = pivot;
13     return low;
14 }
15 int HalfData(int a[], int len)
16 {
17     int start = 0;
18     int end = len - 1;
19     int middle = len >> 1;
20     int index = Partition(a, start, end);
21 
22     while (index != middle)
23     {
24         if (index > middle)
25         {
26             end = index - 1;
27             index = Partition(a, start, end);
28         }
29         else
30         {
31             start = index + 1;
32             index = Partition(a, start, end);
33         }
34     }
35     return a[index];
36 }
37 int main()
38 {
39     int a[9] = { 1, 2, 3, 2, 2, 2, 5, 4, 2 };
40     int len = 9;
41     int result = HalfData(a, 9);
42     printf("result:%d\n", result);
43 
44     system("pause");
45     return 0;
46 }
View Code

4 C++完整代碼  

 1 #include <iostream>
 2 #include <vector>
 3  
 4 using namespace std;
 5  
 6 int MoreThanHalfNum(vector<int> numbers) 
 7 {
 8     if (numbers.size() == 0)
 9     {
10         return 0;
11     }
12  
13     int target = numbers[0];
14     unsigned int cnt = 1;
15     
16     for (unsigned int i = 1; i < numbers.size(); ++i)
17     {
18         if (target == numbers[i])
19         {
20             cnt++;
21         }
22         else
23         {
24             cnt--;
25         }
26  
27         if (cnt == 0)
28         {
29             cnt = 1;
30             target = numbers[i];
31         }
32     }
33     cnt = 0;
34     for (unsigned int i = 0; i < numbers.size(); ++i)
35     {
36         if (target == numbers[i])
37         {
38             cnt++;
39         }
40     }
41  
42     if (cnt * 2 > numbers.size())
43     {
44         return target;
45     }
46  
47     return 0;
48 }
49  
50 int main(void)
51 {
52     int a[] = {1,2,2,2,3,4,2,5,2};
53     vector<int> v(a, a + 9);
54  
55     cout<<MoreThanHalfNum(v)<<endl;
56     
57     return 0;
58 }
View Code

https://blog.csdn.net/u013575812/article/details/50130307

  時間複雜度O(n)。初始認為數組第一個數就是目標數(target)。之後遍曆數組後面的元素,如果等於目標數,計數++; 否則計數--;如果發現目標數的計數<=0 說明當前目標數並不是最終的輸出結果。更新目標數為當前遍歷到的元素。遍歷完數組所有元素之後 驗證一下結果即可。

參考資料

https://blog.csdn.net/zjwreal/article/details/88607992

https://blog.csdn.net/u013575812/article/details/50130307


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言:本人是一個初學者,也是第一次寫博客,敲鍵盤的時候還不知道發佈後是什麼效果,希望內容給其他初學的同學一點幫助,同時加深自己的理解。這篇隨筆講的是Page頁面的生命周期,在開發中是基礎中的基礎,很容易理解。 先給出直達官方的鏈接: 1、小程式頁面生命周期圖:https://developers.w ...
  • JS的原型、原型鏈一直是比較難理解的內容,不少初學者甚至有一定經驗的老鳥都不一定能完全說清楚,更多的"很可能"是一知半解,而這部分內容又是JS的核心內容,想要技術進階的話肯定不能對這個概念一知半解,碰到問題靠“猜”,卻不理解它的規則! prototype 只有函數有prototype屬性 Objec ...
  • 最近在Github上弄項目,需要搭建一個webpack開發環境。Emmm,是的,從0開始搭建一個項目確實不容易,光Webpack的坑就夠我踩一路的了。這不,剛搭建到“圖片打包”這裡,就遇到了麻煩。最後找到了問題的源頭,在mini-css-extract-plugin(抽離CSS代碼為一個CSC文件的 ...
  • 企業應用系統,如果系統之間的通信、集成與整合,尤其當面臨異構系統時,那麼需要分散式的調用與通信。系統中一般會有很多對實時性要求不高但零零碎碎且耗時的地方,比如發送簡訊,郵件提醒,記錄用戶操作日誌等,在用戶訪問量比較大的情況下,對系統壓力比較大。 面對這些問題,我們一般會將這些請求,放在消息隊列MQ中 ...
  • 1 題目描述 求出1~13的整數中1出現的次數,並算出100~1300的整數中1出現的次數?為此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對於後面問題他就沒轍了。ACMer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數(從1 ...
  • 文章瀏覽量統計,low的做法是:用戶每次瀏覽,前端會發送一個GET請求獲取一篇文章詳情時,會把這篇文章的瀏覽量 +1,存進資料庫里。 ...
  • 一、switch練習 註意:switch(int/String) 我們舉例,這裡傳入的是char類型,而實際上卻是'B',就是66 二、我們判斷一個學生成績的等級 三、源碼: d21_switch_exercise.java 地址:https://github.com/ruigege66/Java/ ...
  • [TOC] 原文鏈接: "Markdown模板" 一、概述 用Qt進行開發界面時,既想要實現友好的用戶交互又想界面漂亮,那麼自定義界面就必不可少。其中有一個操作就是是我們每一個Qter開發者都要會的,而且是經常進行的。 Qt::FramelessWindowHint這個屬性想必大家都使用過,有些同學 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...