日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

对分查找的最多次数_「剑指offer题解」数组中出现次数超过一半的数字

發(fā)布時(shí)間:2023/12/10 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对分查找的最多次数_「剑指offer题解」数组中出现次数超过一半的数字 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

關(guān)注我——個(gè)人公眾號(hào):后端技術(shù)漫談

我目前是一名后端開(kāi)發(fā)工程師。主要關(guān)注后端開(kāi)發(fā),數(shù)據(jù)安全,網(wǎng)絡(luò)爬蟲(chóng),物聯(lián)網(wǎng),邊緣計(jì)算等方向。

原創(chuàng)博客主要內(nèi)容

  • Java知識(shí)點(diǎn)復(fù)習(xí)全手冊(cè)
  • Leetcode算法題解析
  • 劍指offer算法題解析
  • SpringCloud菜鳥(niǎo)入門(mén)實(shí)戰(zhàn)系列
  • SpringBoot菜鳥(niǎo)入門(mén)實(shí)戰(zhàn)系列
  • Python爬蟲(chóng)相關(guān)技術(shù)文章
  • 后端開(kāi)發(fā)相關(guān)技術(shù)文章

image

前言

最近看了好多數(shù)據(jù)結(jié)構(gòu)文章,但是數(shù)據(jù)結(jié)構(gòu)拾遺系列遲遲憋不出,主要原因是很多數(shù)據(jù)結(jié)構(gòu)其實(shí)非常偏門(mén),不僅日常很難遇到,學(xué)起來(lái)還涉及很多數(shù)學(xué)模型,很難有快速的理解方法。

本著女排“短平快”的精神,先更新下劍指offer題解系列。

眾所周知,《劍指offer》是一本“好書(shū)”。

為什么這么說(shuō)?因?yàn)樵诿嬖嚴(yán)哮B(niǎo)眼里,它里面羅列的算法題在面試中出現(xiàn)的頻率是非常非常高的。有多高,以我目前不多的面試來(lái)看,在所有遇到的算法體中,本書(shū)算法題出現(xiàn)的概率大概是60%,也就是10道題有6題是書(shū)中原題,如果把變種題目算上,那么這個(gè)出現(xiàn)概率能到達(dá)90%。

如果你是個(gè)算法菜雞(和我一樣),那么最推薦的是先把劍指offer的題目搞明白。

對(duì)于劍指offer題解這個(gè)系列,我的寫(xiě)作思路是,對(duì)于看過(guò)文章的讀者,能夠做到:

  • 迅速了解該題常見(jiàn)解答思路(偏門(mén)思路不包括在內(nèi),節(jié)省大家時(shí)間,實(shí)在有研究需求的人可以查閱其它資料)
  • 思路盡量貼近原書(shū)(例如書(shū)中提到的面試官經(jīng)常會(huì)要求不改變?cè)瓟?shù)組,或者有空間限制等,盡量體現(xiàn)在代碼中,保證讀者可以不漏掉書(shū)中細(xì)節(jié))
  • 盡量精簡(jiǎn)話語(yǔ),避免冗長(zhǎng)解釋
  • 給出代碼可運(yùn)行,注釋齊全,關(guān)注細(xì)節(jié)問(wèn)題

題目介紹

數(shù)組中有一個(gè)數(shù)字出現(xiàn)的次數(shù)超過(guò)數(shù)組長(zhǎng)度的一半,請(qǐng)找出這個(gè)數(shù)字。例如輸入一個(gè)長(zhǎng)度為9的數(shù)組{1,2,3,2,2,2,5,4,2}。由于數(shù)字2在數(shù)組中出現(xiàn)了5次,超過(guò)數(shù)組長(zhǎng)度的一半,因此輸出2。如果不存在則輸出0。

解題思路

方法一

思路

該方法改變了原數(shù)組。

首先要得到一個(gè)推論,那就是一旦有數(shù)字大于數(shù)組的一半,那么排序后的數(shù)組的中位數(shù)肯定是這個(gè)數(shù)字,那么我們就先找出這個(gè)數(shù)字。

這種算法是受快速排序算法的啟發(fā)。在隨機(jī)快速排序算法中,我們現(xiàn)在數(shù)組中隨機(jī)選擇一個(gè)數(shù)字,然后調(diào)整數(shù)組中數(shù)字的順序,使得比選中的數(shù)字小的數(shù)字都排在它的左邊,比選中的數(shù)字大的數(shù)字都排在它的右邊。如果這個(gè)選中的數(shù)字的下標(biāo)剛好是n/2,那么這個(gè)數(shù)字就是數(shù)組的中位數(shù)。如果它的下標(biāo)大于n/2,那么中位數(shù)應(yīng)該位于它的左邊,我們可以接著在它的左邊部分的數(shù)組中查找。如果它的下標(biāo)小于n/2,那么中位數(shù)應(yīng)該位于它的右邊,我們可以接著在它的右邊部分的數(shù)組中查找。這是一個(gè)典型的遞歸過(guò)程

找到這個(gè)數(shù)字后,再判斷他是否符合條件(大于數(shù)組的一半),因?yàn)楹苡锌赡芩菙?shù)組中出現(xiàn)次數(shù)最多的,但是未必大于數(shù)組的一半。

詳細(xì)細(xì)節(jié)見(jiàn)代碼注釋。

代碼

public class Solution { public int MoreThanHalfNum_Solution(int [] array) { if(array.length<=0) { return 0; } int start = 0; int length = array.length; int end = length-1; // 右移1位,相當(dāng)于除2,效率更高 int middle = length>>1; // 當(dāng)前位置 int index = Partition(array,start,end); // 直到取到中位數(shù),才是結(jié)果 while(index!=middle){ if(index>middle){ index = Partition(array,start,index-1); } else{ index = Partition(array,index+1,end); } } int result = array[middle]; // 需要統(tǒng)計(jì)該數(shù)字個(gè)數(shù),必須要大于數(shù)組長(zhǎng)度的一半才能算 int times = 0; for(int i=0;iflag){ end--; } swap(array,start,end); while(array[start]<=flag){ start++; } swap(array,start,end); } return start; } private void swap(int[] array, int num1, int num2){ int temp = array[num1]; array[num1] = array[num2]; array[num2] = temp; }}

方法二:兩兩消除

思路

該方法不改變?cè)瓟?shù)組。

如果有符合條件的數(shù)字,則它出現(xiàn)的次數(shù)比其他所有數(shù)字出現(xiàn)的次數(shù)和還要多。
在遍歷數(shù)組時(shí)保存兩個(gè)值:

  • times:次數(shù)
  • result:當(dāng)前數(shù)字

遍歷下一個(gè)數(shù)字時(shí),若它與之前保存的數(shù)字相同,則次數(shù)加1,否則次數(shù)減1;若次數(shù)為0,則保存下一個(gè)數(shù)字,并將次數(shù)置為1。

遍歷結(jié)束后,所保存的數(shù)字即為所求。

之后,還要再判斷它是否符合大于數(shù)組的一半。

詳細(xì)細(xì)節(jié)見(jiàn)代碼注釋。

代碼

public int MoreThanHalfNum_Solution(int [] array) { int length = array.length; // 檢測(cè)數(shù)組是否為空 if (length == 0){ return 0; } // 初始化result和times參數(shù) int result = array[0]; int times = 1; //遍歷數(shù)組(由于初始化過(guò),所以直接從第二個(gè)數(shù)字開(kāi)始) for(int i=1;i

方法三:hashmap

思路

將數(shù)組中的數(shù)字依次遍歷,并寫(xiě)入hashmap中,hashmap的值是該數(shù)字出現(xiàn)的次數(shù),并在每次循環(huán)中判斷是否該數(shù)次數(shù)大于數(shù)組的一半,若有直接返回?cái)?shù)字,否則遍歷完數(shù)組返回0。

代碼

思路簡(jiǎn)單,代碼略。

總結(jié)

三種方法時(shí)間復(fù)雜度都是O(n)

關(guān)注我

我是一名后端開(kāi)發(fā)。主要關(guān)注后端開(kāi)發(fā),數(shù)據(jù)安全,爬蟲(chóng)等方向。微信:yangzd1102

Github:@qqxx6661

個(gè)人博客:

CSDN:@qqxx6661知乎:@Zhendong簡(jiǎn)書(shū):@蠻三刀把刀掘金:@蠻三刀把刀

原創(chuàng)博客主要內(nèi)容

Java知識(shí)點(diǎn)復(fù)習(xí)全手冊(cè)Leetcode算法題解析劍指offer算法題解析SpringCloud菜鳥(niǎo)入門(mén)實(shí)戰(zhàn)系列SpringBoot菜鳥(niǎo)入門(mén)實(shí)戰(zhàn)系列Python爬蟲(chóng)相關(guān)技術(shù)文章后端開(kāi)發(fā)相關(guān)技術(shù)文章

個(gè)人公眾號(hào):后端技術(shù)漫談

如果文章對(duì)你有幫助,不妨收藏起來(lái)并轉(zhuǎn)發(fā)給您的朋友們~

總結(jié)

以上是生活随笔為你收集整理的对分查找的最多次数_「剑指offer题解」数组中出现次数超过一半的数字的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。