自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

LeetCode題解之旋轉(zhuǎn)數(shù)組的數(shù)字

開(kāi)發(fā) 前端
把一個(gè)數(shù)組最開(kāi)始的若干個(gè)元素搬到數(shù)組的末尾,我們稱(chēng)之為數(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。

[[377700]]

前言

今天繼續(xù)算法題:旋轉(zhuǎn)數(shù)組的最小數(shù)字

題目:旋轉(zhuǎn)數(shù)組的最小數(shù)字

把一個(gè)數(shù)組最開(kāi)始的若干個(gè)元素搬到數(shù)組的末尾,我們稱(chēng)之為數(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。

示例 1:

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

輸入:[2,2,2,0,1] 輸出:0

解法一

首先找到題目的提干:

遞增排序數(shù)組(可以重復(fù)),旋轉(zhuǎn),最小元素

也就是一個(gè)遞增數(shù)組,將一部分移動(dòng)到數(shù)組尾部,比如:

  1. [1,2,3,4,5] 
  2. //旋轉(zhuǎn)之后 
  3. [3,4,5,1,2] 

找到其中的最小數(shù)字。

那么我們很容易想到的第一中解法就是遍歷數(shù)組,然后找到某一個(gè)數(shù)字比它前面一個(gè)數(shù)字小的時(shí)候,那么這個(gè)數(shù)字就是我們要找的最小數(shù)字。

因?yàn)檎?lái)說(shuō)都是后面數(shù)字大于前數(shù)字,所以出現(xiàn)小于前數(shù)字,那么就是這個(gè)旋轉(zhuǎn)數(shù)組的分界點(diǎn),也就是最小數(shù)字了。

  1. class Solution { 
  2.     public int minArray(int[] numbers) { 
  3.         for(int i=0;i<numbers.length-1;i++){ 
  4.             if(numbers[i]>numbers[i+1]){ 
  5.                 return numbers[i+1]; 
  6.             } 
  7.         } 
  8.         return numbers[0]; 
  9.     } 

方法消耗情況

以后不寫(xiě)這個(gè)了。由于每次測(cè)試用例不同,造成的結(jié)果也相差太大,沒(méi)有參考性。

時(shí)間復(fù)雜度

遍歷一次數(shù)組,所以時(shí)間復(fù)雜度為O(n)

空間復(fù)雜度

沒(méi)有用到另外的空間,所以空間復(fù)雜度為O(1)

解法二

二分法。

有的人可能會(huì)疑惑,二分法不是用來(lái)查找順序數(shù)組的嗎,這個(gè)旋轉(zhuǎn)之后也算嗎?

我們回顧下二分法的關(guān)鍵點(diǎn)就是:

取任意一個(gè)關(guān)鍵數(shù)字,都能通過(guò)判斷 來(lái)確定在我們要的值在哪個(gè)區(qū)間(關(guān)鍵數(shù)字的前后)。

那么在我們的旋轉(zhuǎn)數(shù)組中,能做到這一點(diǎn)嗎?

比如我們?nèi)≈虚g值a和最后值b,如果a大于b,就說(shuō)明這個(gè)分界值在這a和b之間,a之前的數(shù)據(jù)是正確排序的。

如果a小于b,說(shuō)明分界值在a之前,a到b之間的數(shù)據(jù)是正確排序的。

比如剛才的[3,4,5,1,2],中間值5大于最后的值2,說(shuō)明分界值在5和2之間,也就是1了。

  1. class Solution { 
  2.     public int minArray(int[] numbers) { 
  3.         int left=0; 
  4.         int right=numbers.length-1; 
  5.         //二分法查找條件 
  6.         while(left<right){ 
  7.             //找到中間點(diǎn) 
  8.             int mid=left+(right-left)/2; 
  9.             if(numbers[mid]<numbers[right]){ 
  10.                 right=mid; 
  11.             }else if(numbers[mid]>numbers[right]){ 
  12.                 left=mid+1; 
  13.             }else
  14.                 right--; 
  15.             } 
  16.         } 
  17.         return numbers[left]; 
  18.     } 

其中right=mid,left=mid+1的原因是因?yàn)?,?dāng)numbers[mid]

而numbers[mid]>numbers[right]的情況下,mid不可能為最小,所以設(shè)置為mid+1。

時(shí)間復(fù)雜度

二分法最壞情況:

n/(2的x次方)=1,x=long2n。所以時(shí)間復(fù)雜度為O(longn)

還有一種情況是所有元素全部相同,這種情況下每次都執(zhí)行right-1,所以時(shí)間復(fù)雜度為O(n)

空間復(fù)雜度

沒(méi)有用到另外的空間,所以空間復(fù)雜度為O(1)

參考

https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof/submissions/

本文轉(zhuǎn)載自微信公眾號(hào)「 碼上積木」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系 碼上積木公眾號(hào)。

 

責(zé)任編輯:武曉燕 來(lái)源: 碼上積木
相關(guān)推薦

2021-07-06 07:01:35

旋轉(zhuǎn)數(shù)組數(shù)字

2021-01-14 08:23:15

LeetCode變量

2021-01-21 08:23:29

鏈表單鏈表循環(huán)鏈表

2021-03-12 08:19:20

數(shù)組跳躍游戲

2021-01-15 08:19:26

二維數(shù)組LeetCode

2021-02-04 08:18:53

LeetCode鏈表

2021-12-01 09:00:57

LeetCode回文數(shù)字算法

2021-01-28 08:20:41

鏈表空間復(fù)雜度

2021-12-14 09:01:01

LeetCode整數(shù)羅馬數(shù)字

2021-12-15 09:00:53

LeetCode 羅馬數(shù)字整數(shù)

2021-03-22 08:23:29

LeetCode二叉樹(shù)節(jié)點(diǎn)

2021-03-02 08:21:58

LeetCode括號(hào)

2021-02-03 13:23:42

鏈表倒數(shù)結(jié)點(diǎn)

2013-05-21 10:42:48

Android游戲開(kāi)發(fā)Bitmap位圖旋轉(zhuǎn)

2009-11-25 09:13:41

PHP數(shù)組轉(zhuǎn)字符串PHP字符串轉(zhuǎn)數(shù)組

2017-11-13 09:38:30

數(shù)字化CIO轉(zhuǎn)型

2021-03-17 08:19:22

二叉樹(shù)LeetCode樹(shù)

2017-03-01 13:58:46

Python數(shù)據(jù)結(jié)構(gòu)鏈表

2024-09-24 18:45:39

數(shù)據(jù)倉(cāng)庫(kù)數(shù)據(jù)中臺(tái)數(shù)據(jù)科技

2021-12-31 09:01:44

LeetCode 羅馬數(shù)字四數(shù)之和
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)