国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

劍指offer面試題8 旋轉(zhuǎn)數(shù)組的最小數(shù)字

這篇具有很好參考價(jià)值的文章主要介紹了劍指offer面試題8 旋轉(zhuǎn)數(shù)組的最小數(shù)字。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

考察點(diǎn)

算法二分搜索

知識(shí)點(diǎn)

二分搜索算法是針對(duì)排序的數(shù)組,先找到中間元素,如果待查找元素比中間元素大,說明待查
找元素肯定不在左邊那片區(qū)域內(nèi),如果待查找元素比中間元素小,說明待查找元素肯定不在右
邊那片區(qū)域內(nèi),反復(fù)進(jìn)行該過程直到找到元素為止對(duì)于搜索而言,降低復(fù)雜度的唯一方式就是
每一次輪詢以后能縮小搜索范圍或者過濾掉更多的不可能元素,我們最普通的遍歷數(shù)組的方式
,每輪詢完一次只能過濾掉一個(gè)元素。而二分搜索每輪詢完一次可以過濾掉一半的元素,因此
這就是它非常高效的原因(log(n))

題目

分析
首先一定要記住只要看到排序數(shù)組的查找,思維一定要往二分法上靠,然后再思考清楚如何利用二分法。而如何利用二分法一定要仔細(xì)分析所給的數(shù)組的特點(diǎn):遞增數(shù)組且最開始的若干元素搬到數(shù)組的末尾,相當(dāng)于該數(shù)組由倆個(gè)遞增小數(shù)組構(gòu)成,前面的數(shù)組元素肯定大于等于后面的數(shù)組元素,且最小值肯定是第二個(gè)小數(shù)組的第一個(gè)元素。二分法需要首尾倆個(gè)指針以及中間元素,可以肯定的是如果中間元素比最左邊的值大那說明最小值肯定在右邊(左邊的小遞增數(shù)組特性),如果中間元素比最右邊的值小那說明最小值肯定在左邊(右邊的小遞增數(shù)組特性),到這一步的時(shí)候就需要拿數(shù)字舉例一下看到底應(yīng)該怎么找到最小值,最終舉例完以后會(huì)發(fā)現(xiàn)按照上面的思路最終左邊的指針和右邊的指針相差1的時(shí)候,右邊的指針指向的就是最小的元素(在解題沒有思路的時(shí)候拿實(shí)際數(shù)據(jù)算一下然后找出其中的規(guī)律,我們的算法說白了就是把這個(gè)規(guī)律用程序表達(dá)出來)。最后考慮一些異常的情況:中間元素比最左邊的值大的時(shí)候最小值肯定在右邊嗎?不一定,考慮數(shù)組{1,0,1,1,1}的情況,因此當(dāng)最左邊元素和中間元素以及最右邊元素值相同的時(shí)候,就不能再使用二分法進(jìn)行查找了
(末尾附上二分查找代碼)文章來源地址http://www.zghlxwxcb.cn/news/detail-820916.html

public class Eight {
	public static void main(String[] args) {
		int[] arr = {3,4,5,1,2};
		System.out.println(findMin(arr));
		int[] brr = {1,0,1,1,1};
		System.out.println(findMin(brr));
		int[] crr = {1,1,1,0,1};
		System.out.println(findMin(crr));
		int[] drr = {5,4,3,2,1};
		System.out.println(findMin(drr));
	}
	public static int findMin(int[] arr) {
		if (arr.length <= 0) {
			throw new Error("input error");
		}
		int start = 0;
		int end = arr.length - 1;
		if (arr[start] < arr[end]) {
			return arr[start];
		}
		while(arr[start] >= arr[end]) {
			if (start + 1 == end) {
				return arr[end];
			}
			int mid = (start + end) / 2;
			if (arr[start] == arr[mid] && arr[end] == arr[mid]) {
				int val = arr[start];
				for (int idx = start + 1;idx <= end;idx++) {
					if (val > arr[idx]) {
						val = arr[idx];
					}
				}
				return val;
			}
			if (arr[mid] >= arr[start]) {
				start = mid;
			} else if (arr[mid] <= arr[end]) {
				end = mid;
			} else {
				break;
			}
		}
		throw new Error("input error");
	}
}
//附上二分法查找
public class Erfen {
	public static void main(String[] args) {
		int[] arr = {1,2,3,4,11,17,18};
		System.out.println(erfen(arr,12));
		System.out.println(erfen(arr,18));
		System.out.println(erfen(arr,1));
		System.out.println(erfen(arr,11));

	}
	public static int erfen(int[] arr,int val) {
		int start = 0;
		int end = arr.length - 1;
		while(start <= end) {
			int mid = (start + end) / 2;
			if (arr[mid] == val) {
				return mid;
			} else if (arr[mid] < val) {
				start = mid + 1;
			} else {
				end = mid - 1;
			}
		}
		return -1;
	}
}

到了這里,關(guān)于劍指offer面試題8 旋轉(zhuǎn)數(shù)組的最小數(shù)字的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 劍指offer(C++)-JZ56:數(shù)組中只出現(xiàn)一次的兩個(gè)數(shù)字(算法-位運(yùn)算)

    劍指offer(C++)-JZ56:數(shù)組中只出現(xiàn)一次的兩個(gè)數(shù)字(算法-位運(yùn)算)

    作者:翟天保Steven 版權(quán)聲明:著作權(quán)歸作者所有,商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處 題目描述: 一個(gè)整型數(shù)組里除了兩個(gè)數(shù)字只出現(xiàn)一次,其他的數(shù)字都出現(xiàn)了兩次。請(qǐng)寫程序找出這兩個(gè)只出現(xiàn)一次的數(shù)字。 數(shù)據(jù)范圍:數(shù)組長度2≤n≤1000,數(shù)組中每個(gè)數(shù)

    2024年02月10日
    瀏覽(22)
  • 劍指offer45 把數(shù)組排成最小的數(shù)

    劍指offer45 把數(shù)組排成最小的數(shù)

    鏈接 其實(shí)這道題,大概看完就知道是一個(gè)排序的問題,無非就是數(shù)組中的元素以一個(gè)合適的位置排好序,這樣從頭加到尾,組成的整體數(shù)字最??!(題目中也暗示你排序問題了) 個(gè)人捉摸了一會(huì),這道題能很好地鍛煉仿函數(shù)的編寫規(guī)則和庫函數(shù)sort()的配套使用,還有就是巧妙地

    2024年01月16日
    瀏覽(19)
  • Java旋轉(zhuǎn)數(shù)組中的最小數(shù)字(圖文詳解版)

    Java旋轉(zhuǎn)數(shù)組中的最小數(shù)字(圖文詳解版)

    目錄 1.題目描述 2.題解 分析 具體實(shí)現(xiàn) 方法一(遍歷): 方法二(排序): 方法三(二分查找): 有一個(gè)長度為 n 的非降序數(shù)組,比如[1,2,3,4,5],將它進(jìn)行旋轉(zhuǎn),即把一個(gè)數(shù)組最開始的若干個(gè)元素搬到數(shù)組的末尾,變成一個(gè)旋轉(zhuǎn)數(shù)組,比如變成了[3,4,5,1,2],或者[4,5,1,2,3]這樣

    2024年02月13日
    瀏覽(15)
  • 【劍指offer】數(shù)組中重復(fù)的數(shù)字

    【劍指offer】數(shù)組中重復(fù)的數(shù)字

    ??專欄內(nèi)容:力扣刷題 ?個(gè)人主頁:子夜的星的主頁 ??座右銘:前路未遠(yuǎn),步履不停 劍指offer:數(shù)組中重復(fù)的數(shù)字 在一個(gè)長度為 n 的數(shù)組里的所有數(shù)字都在 0 0 0 到 n ? 1 n-1 n ? 1 的范圍內(nèi)。數(shù)組中某些數(shù)字是重復(fù)的,但不知道有幾個(gè)數(shù)字重復(fù),也不知道每個(gè)數(shù)字重復(fù)了幾

    2024年01月20日
    瀏覽(23)
  • (排序) 劍指 Offer 45. 把數(shù)組排成最小的數(shù) ——【Leetcode每日一題】

    (排序) 劍指 Offer 45. 把數(shù)組排成最小的數(shù) ——【Leetcode每日一題】

    難度:中等 輸入一個(gè)非負(fù)整數(shù)數(shù)組,把數(shù)組里所有數(shù)字拼接起來排成一個(gè)數(shù),打印能拼接出的所有數(shù)字中最小的一個(gè)。 示例 1: 輸入: [10,2] 輸出: “102” 示例 2: 輸入: [3,30,34,5,9] 輸出: “3033459” 提示 : 0 nums.length = 100 說明: 輸出結(jié)果可能非常大,所以你需要返回一個(gè)字符串而不

    2024年02月10日
    瀏覽(18)
  • 劍指offer03.數(shù)組中重復(fù)的數(shù)字

    劍指offer03.數(shù)組中重復(fù)的數(shù)字

    看到這道題的第一眼想到的是先給它排序,然后雙指針從左往右遍歷,寫了一個(gè)冒泡排序,但是我想到了應(yīng)該會(huì)超時(shí),因?yàn)槊芭輹r(shí)間復(fù)雜度是n的平方,輸入大小時(shí)10000,肯定會(huì)超時(shí),然后右又看了一下題目看到數(shù)字都是0-n-1,靈感一下子就來了,我先創(chuàng)建一個(gè)等大的自然數(shù)數(shù)

    2024年02月11日
    瀏覽(19)
  • 【劍指offer|1.數(shù)組中重復(fù)的數(shù)字】

    【劍指offer|1.數(shù)組中重復(fù)的數(shù)字】

    : 長度為n的數(shù)組nums中所有數(shù)字都在0~n-1范圍內(nèi) 返回任意一個(gè)重復(fù)的數(shù)字 總體時(shí)間復(fù)雜度和空間復(fù)雜度分析: 修改數(shù)組的方法: 因?yàn)橛衝個(gè)元素,每一個(gè)元素都在0~(n-1)范圍內(nèi),如果元素不重復(fù)的話, 對(duì)數(shù)組重排之后,下標(biāo)和元素值之間應(yīng)該是一一對(duì)應(yīng)的關(guān)系 但是因?yàn)?/p>

    2023年04月22日
    瀏覽(23)
  • 劍指 Offer 03. 數(shù)組中重復(fù)的數(shù)字

    劍指 Offer 03. 數(shù)組中重復(fù)的數(shù)字 利用題目的限制條件: 所有數(shù)字都在 0~n-1 的范圍內(nèi) 通過交互讓數(shù)字和下標(biāo)一一對(duì)應(yīng),如果有多個(gè)數(shù)字對(duì)應(yīng)同一個(gè)下標(biāo),那就找到了答案。 另一種寫法

    2024年02月11日
    瀏覽(21)
  • 劍指 Offer 45. !!把數(shù)組排成最小的數(shù)(使用比較器的定制排序;快速排序)

    劍指 Offer 45. 把數(shù)組排成最小的數(shù) 中等 662 相關(guān)企業(yè) 輸入一個(gè)非負(fù)整數(shù)數(shù)組,把數(shù)組里所有數(shù)字拼接起來排成一個(gè)數(shù),打印能拼接出的所有數(shù)字中最小的一個(gè)。 示例 1: 輸入: [10,2] 輸出: “102” 示例 2: 輸入: [3,30,34,5,9] 輸出: “3033459” 這道題在左程云算法課上講過,但是這次

    2024年02月14日
    瀏覽(22)
  • 劍指offer39.數(shù)組中出現(xiàn)次數(shù)超過一半的數(shù)字

    劍指offer39.數(shù)組中出現(xiàn)次數(shù)超過一半的數(shù)字

    這個(gè)題非常簡單,解法有很多種,我用的是HashMap記錄每個(gè)元素出現(xiàn)的次數(shù),只要次數(shù)大于數(shù)組長度的一半就返回。下面是我的代碼: 題解還有一種更牛逼的解法,把數(shù)組排序,然后返回?cái)?shù)組中間的那個(gè)數(shù)就行,因?yàn)槿绻@個(gè)數(shù)出現(xiàn)的次數(shù)大于數(shù)組長度的一半的話,排完序后

    2024年02月13日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包