成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

數組中出現次數超過一半的數字

開發 前端
數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。你可以假設數組是非空的,并且給定的數組總是存在多數元素。

[[439477]]

本文轉載自微信公眾號「程序員千羽」,作者程序員千羽 。轉載本文請聯系程序員千羽公眾號。

Leetcode : https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof/

GitHub : https://github.com/nateshao/leetcode/blob/main/algo-notes/src/main/java/com/nateshao/sword_offer/topic_31_majorityElement/Solution.java

數組中出現次數超過一半的數字

“題目描述 :數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。你可以假設數組是非空的,并且給定的數組總是存在多數元素。難度:簡單示例:

  1. 輸入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 
  2.  
  3. 輸出: 2 

解題思路:

“本文將 “數組中出現次數超過一半的數字” 簡稱為 “眾數” 。需要注意的是,數學中眾數的定義為 “數組中出現次數最多的數字” ,與本文定義不同。

本題常見的三種解法:

  • 哈希表統計法:遍歷數組 nums ,用HashMap統計各數字的數量,即可找出眾數。此方法時間和空間復雜度均為O(N)。
  • 數組排序法:將數組nums 排序,數組中點的元素一定為眾數。
  • 摩爾投票法:核心理念為票數正負抵消。此方法時間和空間復雜度分別為O(N)和0(1),為本題的 最佳解法。

摩爾投票法:

“設輸入數組 nums 的眾數為x,數組長度為n。

推論一: 若記眾數的票數為+1,非眾數的票數為-1,則一定有所有數字的票數和> 0。推論二: 若數組的前a個數字的票數和=0,則數組剩余(n-a)個數字的票數和一定仍> 0,即后(n- a)個數字的眾數仍為x。

根據以上推論,記數組首個元素為n1,眾數為x,遍歷并統計票數。當發生票數和= 0時,剩余數組的眾 數-定不變,這是由于:

  • 當n1=x:抵消的所有數字中,有一半是眾數x。
  • 當n1≠x:抵消的所有數字中,眾數x的數量最少為0個,最多為一半。

利用此特性,每輪假設發生票數和 = 0 都可以 縮小剩余數組區間 。當遍歷完成時,最后一輪假設的數字即為眾數。

算法流程:

  • 初始化: 票數統計 votes = 0 , 眾數 x;
  • 循環: 遍歷數組 nums 中的每個數字 num ;
    • 當 票數 votes 等于 0 ,則假設當前數字 num 是眾數;
    • 當 num = x 時,票數 votes 自增 1 ;當 num != x 時,票數 votes 自減 1 ;
  • 返回值: 返回 x 即可;

復雜度分析:

  • 時間復雜度 O(N) : N 為數組 nums 長度。
  • 空間復雜度 O(1) : votes 變量使用常數大小的額外空間。
  1. public static int majorityElement1(int[] nums) { 
  2.         int x = 0, votes = 0; 
  3.         for(int num : nums){ 
  4.             if(votes == 0) x = num; 
  5.             votes += num == x ? 1 : -1;// votes = votes + ( num == x ? 1 : -1); 
  6.         } 
  7.         return x; 
  8.     } 

拓展: 由于題目說明 給定的數組總是存在多數元素 ,因此本題不用考慮 數組不存在眾數 的情況。若考慮,需要加入一個 “驗證環節” ,遍歷數組 nums 統計 x 的數量。

  • 若 x 的數量超過數組長度一半,則返回 x ;
  • 否則,返回未找到眾數;

時間和空間復雜度不變,仍為 O(N)和 O(1) 。

  1. public int majorityElement11(int[] nums) { 
  2.         int x = 0, votes = 0, count = 0; 
  3.         for(int num : nums){ 
  4.             if(votes == 0) x = num; 
  5.             votes += num == x ? 1 : -1; 
  6.         } 
  7.         // 驗證 x 是否為眾數 
  8.         for(int num : nums) 
  9.             if(num == x) count++; 
  10.         return count > nums.length / 2 ? x : 0; // 當無眾數時返回 0 
  11.     } 

代碼

  1. package com.nateshao.sword_offer.topic_31_majorityElement; 
  2.  
  3. import java.util.Arrays; 
  4.  
  5. /** 
  6.  * @date Created by 邵桐杰 on 2021/12/5 17:16 
  7.  * @微信公眾號 程序員千羽 
  8.  * @個人網站 www.nateshao.cn 
  9.  * @博客 https://nateshao.gitee.io 
  10.  * @GitHub https://github.com/nateshao 
  11.  * @Gitee https://gitee.com/nateshao 
  12.  * Description: 劍指 Offer 39. 數組中出現次數超過一半的數字 
  13.  * 題目描述:數組中有一個數字出現的次數超過數組長度的一半,請找出這個數 
  14.  * 字。如果不存在則輸出 0。 
  15.  */ 
  16. public class Solution { 
  17.     public static void main(String[] args) { 
  18.         int[] arr = {1, 2, 3, 2, 2, 2, 5, 4, 2}; 
  19.         int i1 = majorityElement1(arr); 
  20.         int i2 = majorityElement2(arr); 
  21.         int i3 = majorityElement3(arr); 
  22.         System.out.println("i = " + i1); // i = 2 
  23.         System.out.println("i2 = " + i2); 
  24.         System.out.println("i3 = " + i3); 
  25.  
  26.     } 
  27.     /******************** 精選 *********************/ 
  28.     public static int majorityElement1(int[] nums) { 
  29.         int x = 0, votes = 0; 
  30.         for(int num : nums){ 
  31.             if(votes == 0) x = num; 
  32.             votes += num == x ? 1 : -1;// votes = votes + ( num == x ? 1 : -1); 
  33.         } 
  34.         return x; 
  35.     } 
  36.     /**************** 拓展 *********************/ 
  37.     public int majorityElement11(int[] nums) { 
  38.         int x = 0, votes = 0, count = 0; 
  39.         for(int num : nums){ 
  40.             if(votes == 0) x = num; 
  41.             votes += num == x ? 1 : -1; 
  42.         } 
  43.         // 驗證 x 是否為眾數 
  44.         for(int num : nums) 
  45.             if(num == x) count++; 
  46.         return count > nums.length / 2 ? x : 0; // 當無眾數時返回 0 
  47.     } 
  48.     /****************** 劍指offer **********************/ 
  49.     /** 
  50.      * 思路:將首次出現的數 count+1,與之后的數進行比較,相等則+1,否則—1, 
  51.      * 最后進行校驗是否超過長度的一半。 
  52.      * 
  53.      * @param nums 
  54.      * @return 
  55.      */ 
  56.     public static int majorityElement2(int[] nums) { 
  57.         int count = 0; 
  58.         int candidate = 0; 
  59.         for (int num : nums) { 
  60.             if (count == 0) candidate = num; 
  61.             count += (num == candidate) ? 1 : -1; 
  62.         } 
  63.         return checkMoreThanHalf(nums, candidate) ? candidate : 0; 
  64.     } 
  65.  
  66.     private static boolean checkMoreThanHalf(int[] array, int number) { 
  67.         int times = 0; 
  68.         for (int i : array) { 
  69.             if (i == number) times++; 
  70.         } 
  71.         return times * 2 >= array.length; 
  72.     } 
  73.  
  74.  
  75.     public static int majorityElement3(int[] nums) { 
  76.         Arrays.sort(nums); 
  77.         return nums[nums.length/2]; 
  78.     } 

 參考文獻:https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof/solution/mian-shi-ti-38-zi-fu-chuan-de-pai-lie-hui-su-fa-by/

 

責任編輯:武曉燕 來源: 程序員千羽
相關推薦

2020-07-13 09:48:58

云計算云安全數據

2015-07-27 10:24:01

蘋果中國

2013-02-25 10:11:35

4GLTE商用網絡

2020-12-04 10:11:26

Unsafejava并發包

2018-12-20 09:04:33

谷歌搜索移動

2020-06-05 15:02:19

混合云多云云計算

2022-02-07 09:53:15

物聯網設備漏洞物聯網

2013-11-27 15:48:56

移動中間件廠商

2018-06-03 08:49:21

2013-01-11 13:28:36

移動互聯網訪問流量iOS

2017-02-24 13:53:38

HTTPS流量互聯網

2017-02-27 16:54:20

HTTPS網絡流量互聯網

2016-12-16 13:07:30

云存儲運營混合云

2010-09-17 16:21:33

系統升級

2011-08-17 10:53:16

Firefox 7

2009-04-30 09:01:25

微軟操作系統Windows 7

2019-10-30 15:22:37

數字化轉型IDC零售

2023-07-20 12:32:42

Linux桌面

2017-09-18 16:29:55

多云OpenStack無服務器

2010-07-12 09:28:59

Windows 764位
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一区二区三区在线视频 | 精品国模一区二区三区欧美 | 国产精品午夜电影 | 成人av一区| 欧美日韩一区二区三区四区 | 国产91亚洲精品一区二区三区 | 亚洲日韩中文字幕 | 久久精品中文字幕 | 在线视频一区二区 | 91人人爽 | 三级成人在线 | 欧美性受xxxx | 欧美2区| 999久久久免费精品国产 | av国产精品| 中文字幕日本一区二区 | 91porn在线| 欧美一级在线观看 | 国产一区二区三区免费观看视频 | 成人av片在线观看 | 久久久精品一区二区 | 久久久久国产精品免费免费搜索 | 成人免费视频在线观看 | 黄色一级毛片免费看 | 久久精品高清视频 | 视频在线亚洲 | 综合婷婷 | 免费一区二区 | 搞av.com| 一区二区三区视频在线 | 久久久久久久一区二区 | 久久天堂 | 在线播放亚洲 | 精品视频一区二区三区在线观看 | 欧美激情一区二区三区 | 久久久精品视频一区二区三区 | 成人三级视频 | 午夜视频一区二区 | 日韩一区二区在线看 | www.日韩免费 | 国产精品久久久久久久久图文区 |