中國(guó)建設(shè)學(xué)會(huì)網(wǎng)站企業(yè)網(wǎng)站模板源碼
目錄
- 題目
- 解法
- lambda在這是怎么用的?
題目
(這是一個(gè) 交互式問(wèn)題 )
你可以將一個(gè)數(shù)組 arr 稱(chēng)為 山脈數(shù)組 當(dāng)且僅當(dāng):
arr.length >= 3
存在一些 0 < i < arr.length - 1 的 i 使得:
arr[0] < arr[1] < … < arr[i - 1] < arr[i]
arr[i] > arr[i + 1] > … > arr[arr.length - 1]
給定一個(gè)山脈數(shù)組 mountainArr ,返回 最小 的 index 使得 mountainArr.get(index) == target。如果不存在這樣的 index,返回 -1 。
你無(wú)法直接訪(fǎng)問(wèn)山脈數(shù)組。你只能使用 MountainArray 接口來(lái)訪(fǎng)問(wèn)數(shù)組:
MountainArray.get(k) 返回?cái)?shù)組中下標(biāo)為 k 的元素(從 0 開(kāi)始)。
MountainArray.length() 返回?cái)?shù)組的長(zhǎng)度。
調(diào)用 MountainArray.get 超過(guò) 100 次的提交會(huì)被判定為錯(cuò)誤答案。此外,任何試圖繞過(guò)在線(xiàn)評(píng)測(cè)的解決方案都將導(dǎo)致取消資格。
解法
class Solution {int binary_search(MountainArray &mountain, int target, int l, int r, int key(int)) {target = key(target);while (l <= r) {int mid = (l + r) / 2;int cur = key(mountain.get(mid));if (cur == target) {return mid;} else if (cur < target) {l = mid + 1;} else {r = mid - 1;}}return -1;}
public:int findInMountainArray(int target, MountainArray &mountainArr) {int l = 0, r = mountainArr.length() - 1;while (l < r) {int mid = (l + r) / 2;if (mountainArr.get(mid) < mountainArr.get(mid + 1)) {l = mid + 1;} else {r = mid;}}int peak = l;int index = binary_search(mountainArr, target, 0, peak, [](int x) -> int{return x;});if (index != -1) {return index;}return binary_search(mountainArr, target, peak + 1, mountainArr.length() - 1, [](int x) -> int{return -x;});}
};
lambda在這是怎么用的?
int index = binary_search(mountainArr, target, 0, peak, [](int x) -> int{return x;});
[](int x)是輸入類(lèi)型,得到返回類(lèi)型
0到peak時(shí)升序,key(x)=int{return x;},peak+1到length-1降序,key(x)=int{return -x;}這樣左右公用一個(gè)函數(shù)
在降序的時(shí)候,比較規(guī)則就不一樣了,函數(shù)也需要重寫(xiě),用這種方法可以少寫(xiě)一個(gè)函數(shù)
key 是一個(gè)函數(shù)指針,它指向一個(gè)函數(shù),該函數(shù)接受一個(gè)整數(shù)參數(shù)并返回一個(gè)整數(shù)值。在這個(gè)代碼片段中,key 函數(shù)的作用是對(duì)目標(biāo)值 target 和數(shù)組中的元素進(jìn)行轉(zhuǎn)換,以滿(mǎn)足二分查找的要求。