1 問題
給定由整數(shù)組成的山峰數(shù)組 arr ,返回任何滿足 arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i + 1] > ... > arr[arr.length - 1] 的下標(biāo) i ,即山峰頂部。
示例 1:
輸入:arr = [0,1,0]
輸出:1
示例 2:
輸入:arr = [1,3,5,4,2]
輸出:2
2 方法
循環(huán)遍歷
題目給的是一個(gè)山峰數(shù)組,所以是先遞增再遞減
思路一:
對(duì)數(shù)組進(jìn)行遍歷,如果遍歷到的那個(gè)元素比下一個(gè)元素大,則這個(gè)元素。
二分法查找
在山峰數(shù)組中,因?yàn)槭窍冗f增再遞減,要使用二分查找方法的話
假設(shè)滿足題目要求所要得元素下標(biāo)為mid,那么就滿足在下標(biāo)i<mid時(shí),
這個(gè)時(shí)候arr[i]<arr[i+1]是一直成立的,相反,在滿足下標(biāo)i>mid時(shí),arr[i]>arr[i+1]也是一直成立的。
這樣就有一個(gè)思路:
定義左邊left=0,右邊right=len(arr)-2,ans = 0。
這樣定義是防止特殊數(shù)組的出現(xiàn),如只有三個(gè)數(shù)的數(shù)組,這個(gè)時(shí)候就取中間 。mid = (left+right)/2
如果arr[mid]>arr[mid+1],則定義ans = mid,此時(shí)right向左邊移動(dòng)一位,如果arr[mid]<arr[mid+1],則left向左邊移動(dòng)一位。
代碼如下:
第三種:使用python內(nèi)部函數(shù)
直接使用max(arr)求出最大值,再arr.index(max(arr))直接求出最大值下標(biāo)。
山峰數(shù)組代碼
//循環(huán)遍歷查找最大值 arr = [12, 26, 48, 49, 56, 79, 50, 44, 32, 11] n = len(arr) ans = 0 for i in range(n): if arr[i] > arr[i + 1]: ans = i break print(ans) //使用二分法查找 arr = [12, 26, 48, 49, 56, 79, 50, 44, 32, 11] n = len(arr) left, right, ans = 1, n - 2, 0 while left <= right: mid = (left + right) // 2 if arr[mid] > arr[mid + 1]: ans = mid right = mid - 1 else: left = mid + 1 print(ans) //使用python內(nèi)部函數(shù)直接求 arr = [12, 26, 48, 49, 56, 79, 50, 44, 32, 11] print(arr.index(max(arr))) |
4 結(jié)語
針對(duì)山峰數(shù)組問題,提出了循環(huán)遍歷,二分法,python內(nèi)部函數(shù)等方法解決問題,對(duì)于二分法要注意的是,每一次進(jìn)行二分法查找之前,先對(duì)定義的指針進(jìn)行移動(dòng)。
實(shí)習(xí)編輯:李欣容
稿件來源:深度學(xué)習(xí)與文旅應(yīng)用實(shí)驗(yàn)室(DLETA)
聯(lián)系客服