摘要:如此,便可以縮小搜索范圍,提高時(shí)間復(fù)雜度,最終第一個(gè)指針指向前面子數(shù)組的最后一個(gè)元素,而第二個(gè)指針指向后面子數(shù)組的第一個(gè)元素,它們處于相鄰位置,而第二個(gè)指針指向的剛好是最小的元素。
旋轉(zhuǎn)數(shù)組的最小數(shù)字(二分查找)
把一個(gè)數(shù)組最開始的若干個(gè)元素搬到數(shù)組的末尾,我們稱之為數(shù)組的旋轉(zhuǎn)。 輸入一個(gè)非遞減排序的數(shù)組的一個(gè)旋轉(zhuǎn),輸出旋轉(zhuǎn)數(shù)組的最小元素。 例如數(shù)組{3,4,5,1,2}為{1,2,3,4,5}的一個(gè)旋轉(zhuǎn),該數(shù)組的最小值為1。 NOTE:給出的所有元素都大于0,若數(shù)組大小為0,請(qǐng)返回0。
思路:
1.設(shè)置兩個(gè)指針,初始狀態(tài)第一個(gè)指針指向前面子數(shù)組的第一個(gè)元素,第二個(gè)指針指向后面子數(shù)組的最后一個(gè)元素;
2.找到兩個(gè)指針的中間元素;
3.若其大于等于第一個(gè)指針指向的元素,則說明其在前面的子數(shù)組中,且顯然最小元素在中間元素的右邊,若其小于等于第二個(gè)指針指向的元素,則說明其在后面的子數(shù)組中,且顯然最小元素在中間元素的左邊。
如此,便可以縮小搜索范圍,提高時(shí)間復(fù)雜度,最終第一個(gè)指針指向前面子數(shù)組的最后一個(gè)元素,而第二個(gè)指針指向后面子數(shù)組的第一個(gè)元素,它們處于相鄰位置,而第二個(gè)指針指向的剛好是最小的元素。
注意:按旋轉(zhuǎn)規(guī)則,第一個(gè)元素應(yīng)該是大于或等于最后一個(gè)元素的;但也有特例:若把排序數(shù)組的前0個(gè)元素搬到最后面,及排序數(shù)組本身,仍是數(shù)組的一個(gè)旋轉(zhuǎn),此時(shí)數(shù)組中的第一個(gè)數(shù)字是最小的數(shù)字。
注意:當(dāng)兩個(gè)指針指向的數(shù)字及它們中間的數(shù)字三者相等時(shí),無法判斷中間數(shù)字位于前面的子數(shù)組還是后面的子數(shù)組,也就無法移動(dòng)兩個(gè)指針來縮小查找的范圍,此時(shí)只能用順序查找的方法。
例如:數(shù)組{1,0,1,1,1}和數(shù)組{1,1,1,0,1}都可看成是遞增數(shù)組{0,1,1,1,1}的旋轉(zhuǎn)。第一種情況,中間數(shù)字位于后面的子數(shù)組,第二種情況,中間數(shù)字位于前面的子數(shù)組。
function minNumberInRotateArray(arr) { let index1 = 0; let index2 = arr.length - 1; let indexMid = index1; while(arr[index1] >= arr[index2]) { if(index2 - index1 == 1) { indexMid = index2; break; } indexMid = Math.floor((index1 + index2 ) / 2); //如果下標(biāo)為index1、index2和indexMid指向的三個(gè)數(shù)字相等 //則只能順序查找 if(arr[index1] == arr[index2] && arr[indexMid] == arr[index1]) { return MininOrder(arr,index1,index2); } if(arr[indexMid] >= arr[index1]) { index1 = indexMid; } if(arr[indexMid] <= arr[index2]) { index2 = indexMid; } } return arr[indexMid]; } //按順序查找函數(shù) function MininOrder(arr,index1,index2) { let res = arr[index1]; for (var i = index1 + 1; i <= index2; i++) { if(res > arr[i]) { res = arr[i]; } } return res; } console.log(minNumberInRotateArray([3,4,5,1,2]));
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/107504.html
摘要:為檢查長度為的列表,二分查找需要執(zhí)行次操作。最后需要指出的一點(diǎn)是高水平的讀者可研究一下二叉樹關(guān)于二叉樹,戳這里數(shù)據(jù)結(jié)構(gòu)與算法二叉樹算法常見練習(xí)在一個(gè)二維數(shù)組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。 常見數(shù)據(jù)結(jié)構(gòu) 簡單數(shù)據(jù)結(jié)構(gòu)(必須理解和掌握) 有序數(shù)據(jù)結(jié)構(gòu):棧、隊(duì)列、鏈表。有序數(shù)據(jù)結(jié)構(gòu)省空間(儲(chǔ)存空間?。?無序數(shù)據(jù)結(jié)構(gòu):集合、字典、散列表,無序...
摘要:為檢查長度為的列表,二分查找需要執(zhí)行次操作。最后需要指出的一點(diǎn)是高水平的讀者可研究一下二叉樹關(guān)于二叉樹,戳這里數(shù)據(jù)結(jié)構(gòu)與算法二叉樹算法常見練習(xí)在一個(gè)二維數(shù)組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。 常見數(shù)據(jù)結(jié)構(gòu) 簡單數(shù)據(jù)結(jié)構(gòu)(必須理解和掌握) 有序數(shù)據(jù)結(jié)構(gòu):棧、隊(duì)列、鏈表。有序數(shù)據(jù)結(jié)構(gòu)省空間(儲(chǔ)存空間?。?無序數(shù)據(jù)結(jié)構(gòu):集合、字典、散列表,無序...
摘要:為檢查長度為的列表,二分查找需要執(zhí)行次操作。最后需要指出的一點(diǎn)是高水平的讀者可研究一下二叉樹關(guān)于二叉樹,戳這里數(shù)據(jù)結(jié)構(gòu)與算法二叉樹算法常見練習(xí)在一個(gè)二維數(shù)組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。 常見數(shù)據(jù)結(jié)構(gòu) 簡單數(shù)據(jù)結(jié)構(gòu)(必須理解和掌握) 有序數(shù)據(jù)結(jié)構(gòu):棧、隊(duì)列、鏈表。有序數(shù)據(jù)結(jié)構(gòu)省空間(儲(chǔ)存空間?。?無序數(shù)據(jù)結(jié)構(gòu):集合、字典、散列表,無序...
摘要:數(shù)據(jù)結(jié)構(gòu)程序數(shù)據(jù)結(jié)構(gòu)算法數(shù)據(jù)結(jié)構(gòu)基本概念數(shù)據(jù)的邏輯結(jié)構(gòu)反映數(shù)據(jù)元素之間的關(guān)系的數(shù)據(jù)元素集合的表示。這兩部分信息組成數(shù)據(jù)元素的存儲(chǔ)映象,稱為結(jié)點(diǎn)。 本文涉及更多的是概念,代碼部分請(qǐng)參考之前寫過的 2 篇博客 基于 Javascript 的排序算法 基于 javascript 的基本數(shù)據(jù)結(jié)構(gòu)和查找算法 本文主要是基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)和算法概念,可能部分地方會(huì)涉及更高級(jí)的算法和算法,具體內(nèi)容以...
摘要:棧被稱為一種后入先出的數(shù)據(jù)結(jié)構(gòu)。散列使用的數(shù)據(jù)結(jié)構(gòu)叫做散列表。這些操作需要求助于其他數(shù)據(jù)結(jié)構(gòu),比如下面介紹的二叉查找樹。 前言 在過去的幾年中,得益于Node.js的興起,JavaScript越來越廣泛地用于服務(wù)器端編程。鑒于JavaScript語言已經(jīng)走出了瀏覽器,程序員發(fā)現(xiàn)他們需要更多傳統(tǒng)語言(比如C++和Java)提供的工具。這些工具包括傳統(tǒng)的數(shù)據(jù)結(jié)構(gòu)(如鏈表,棧,隊(duì)列,圖等),...
摘要:通過兩個(gè)二分查找的條件繼續(xù)進(jìn)行問題的分析,那么問題又來了,二分查找是快速的查找一個(gè)數(shù)據(jù)是否存在一組數(shù)據(jù)中,而且效率極高,億查找一個(gè)數(shù)據(jù)只需次查找。二分查找的三點(diǎn)重點(diǎn)循環(huán)退出條件注意是而不是。 showImg(https://segmentfault.com/img/remote/1460000018761246);這篇文章主要深入數(shù)據(jù)結(jié)構(gòu)與算法在解決實(shí)際問題怎么運(yùn)用和分析的,對(duì)于 IP...
閱讀 3734·2021-11-22 11:59
閱讀 1014·2021-09-27 13:36
閱讀 3751·2021-09-24 09:47
閱讀 2351·2021-09-01 11:39
閱讀 1041·2021-08-31 09:37
閱讀 2393·2021-08-05 10:01
閱讀 1769·2019-08-30 15:55
閱讀 758·2019-08-30 15:54