陣列中的最長山脈
題目描述提示幫助提交記錄社群討論閱讀解答
隨機一題
我們把陣列 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)的候選答案。
方法二:直接計算長度。當a[i-1]=a[i]或下降》0&a[i-1]& a)class solution
}
base=max(end,base+1);
}return ans;
}
};
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。給出乙個整數陣列 ...