845 陣列中的最長山脈LeetCode

2021-09-02 17:41:12 字數 1693 閱讀 1626

陣列中的最長山脈

題目描述提示幫助提交記錄社群討論閱讀解答

隨機一題

我們把陣列 a 中符合下列屬性的任意連續子陣列 b 稱為 「山脈」:

b.length >= 3

存在 0 < i < b.length - 1 使得 b[0] < b[1] < … b[i-1] < b[i] > b[i+1] > … > b[b.length - 1]

(注意:b 可以是 a 的任意子陣列,包括整個陣列 a。)

給出乙個整數陣列 a,返回最長 「山脈」 的長度。

如果不含有 「山脈」 則返回 0。

示例 1:

輸入:[2,1,4,7,3,2,5]

輸出:5

解釋:最長的 「山脈」 是 [1,4,7,3,2],長度為 5。

示例 2:

輸入:[2,2,2]

輸出:0

解釋:不含 「山脈」。

0 <= a.length <= 10000

0 <= a[i] <= 10000

方法#1:兩個指標[

直覺:在不喪失一般性的前提下,一座山只能在前一座山結束後開始這是因為如果它開始於山峰之前,它會比之前的山要小;而且在高峰之後開始是不可能的。

演算法:對於乙個起始的索引基,讓我們計算最長的山的長度a [base], a [base+1],…(結束),如果存在這樣的山,下乙個可能的山將從base = end開始;如果沒有,那麼要麼我們到達終點,要麼我們有乙個[底]> a[底+1]我們可以從底+1開始。

例子:下面是陣列a =[1,2,3,2,1,0,2,3,1]的工作示例:

base從o開始,end使用第乙個while迴圈到達end =2 (a[end] =3),即這座山的潛在峰值。之後,它在第二個while迴圈中移動到end =5 (a[end] =0),並記錄6 (base =0, end =5)的候選答案。然後將base設定為5,過程重新開始,end =7為山峰,end = 8為正確邊界,記錄4 (base = 5, end = 8)的候選答案。

class solution 

}

base=max(end,base+1);

}return ans;

}

};

方法二:直接計算長度。當a[i-1]=a[i]或下降》0&a[i-1]& a)

cout

up[i]+=up[i-1]+1;

if(up[i] && down[i])

ans=max(ans,up[i]+down[i]+1);

}return ans;

}

};方法四:

暴力搜尋

class solution
if (turn == 2)

length++;

} else if (turn > 0 && a[j] > a[j + 1])

} else

}if (length > max && turn > 1)

} if (max == 1)

return max;}};

845 陣列中的最長山脈

我們把陣列 a 中符合下列屬性的任意連續子陣列 b 稱為 山脈 注意 b 可以是 a 的任意子陣列,包括整個陣列 a。給出乙個整數陣列a,返回最長 山脈 的長度。如果不含有 山脈 則返回0。示例 1 輸入 2,1,4,7,3,2,5 輸出 5 解釋 最長的 山脈 是 1,4,7,3,2 長度為 5。...

845 陣列中的最長山脈

給出乙個整數陣列 a,返回最長 山脈 的長度。如果不含有 山脈 則返回 0。很容易想到暴力解法的思路,遍歷陣列,然後開始中心擴充套件,左邊需要嚴格遞減,右邊需要嚴格遞增,注意到兩邊都需要擴充套件。class solution int ans 0 for int i 1 i n 1 i 右邊擴充套件 ...

845 陣列中的最長山脈

845.陣列中的最長山脈 我們把陣列 a 中符合下列屬性的任意連續子陣列 b 稱為 山脈 b.length 3 存在 0 i b.length 1 使得 b 0 b 1 b i 1 b i b i 1 b b.length 1 注意 b 可以是 a 的任意子陣列,包括整個陣列 a。給出乙個整數陣列 ...