可見的山峰對數量

2021-09-25 05:03:50 字數 1701 閱讀 5028

題目:乙個不含有負數的陣列可以代表一圈環形山,每個位置的值代表山的高度,比如{3,1,2,4,5}、{4,5,3,1,2}或{1,2,4,5,3}都代表同樣結構的環形山。3->1->2->4->5->3方向叫做next方向(逆時針),3->5->4->2->1->3方向叫做last方向叫做last方向(順時針)

山峰a和山峰b能夠相互看見的條件為:

1、如果a和b是同一座山,認為互相看不見

2、如果a和b是不同的山,並且在環中相鄰,認為可以相互看見

3、如果a和b是不同的山,並且在環中不相鄰,假設兩座山高度最小值為min。如果a通過next方向到b的途中沒有高度比min大的山峰,或者a通過last方向到b的途中沒有高度比min大的山峰,認為a和b可以相互看見

給定乙個不含負數且沒有重複值的陣列arr,請返回有多少對山峰可以互相看見

高階問題:給定乙個不含油負數但可能含有重複值的陣列arr,返回有多少對山峰能夠相互看見

要求:如果arr的長度為n,沒有重複值的情況下時間複雜度達到o(1),可能有重複值的情況下時間複雜度為o(n)

思路:陣列中所有數字不一樣,環形結構只有1座山峰,可見山峰對為0;環形結構中只有兩座山峰時,可見山峰的數量為1.環形結構中有i座山峰時(i>2)可見山峰對的數量為2i-3.  高度小的山峰去找高度大的山峰。

高階**:

def getvisibnum(l):

if l == none or len(l) < 2:

return 0

#找到最大值所在位置

maxindex = 0

for in in range(len(l)):

if l[maxindex] < l[i]:

maxindex = i

stack =

index = nextindex(maxindex,len(l))

res = 0

while index!=maxindex:

while stack[-1][0] < l[index]:

k = stack.pop()[1]

res += getnum(k) + 2*k

if stack[-1][0] == l[index]:

stack[-1][1] += 1

else:

index = nextindex(maxindex,len(l))

while len(stack) > 2:

times = stack.pop()[1]

res += getnum(times) + 2* times

while len(stack) == 2:

times = stack.pop()[1]

if stack[-1][1] == 1:

res += getnum(times) + times

else:

res += getnum(times) + 2 * times

res + = getnum(stack.pop()[1])

def nextindex(k,size):

if k < (size-1):

return k + 1

else:

return 0

def getnum(k):

if k == 1:

return 0

else:

return (k*(k-1))/2

可見的山峰對數量

可見的山峰對數量 乙個不含有負數陣列可以代表一圈環形山,每個位置的值代表山的高度。比如,或都代表同樣結構的環形山。3 1 2 4 5 3 方向叫作 next 方向 逆時針 3 5 4 2 1 3 方向叫作 last 方向 順時針 山峰 a 和 山峰 b 能夠相互看見的條件為 如果 a 和 b 是同一...

棧與佇列10 可見的山峰對數量

乙個不含有負數的陣列可以代表一圈環形山,每個位置的值代表山的高度。有兩個方向 next方向 逆時針方向 last 方向 順時針 山峰a和山峰b相互看見的條件為 如果a和b是同一座山,認為不能相互看見 如果a和b是不同的山,並且在環中相鄰,認為可以相互看見 如果a和b是不同的山,並且在環中不相鄰,假設...

尋找最後的山峰

山峰元素是指其值大於或等於左右相鄰值的元素。給定乙個輸入陣列nums,任意兩個相鄰元素值不相等,陣列可能包含多個山峰。找到索引最大的那個山峰元素並返回其索引。分析 本問題思想較為簡單,即比較與討論數字相鄰兩數字之間的大小即可。但應考慮到幾種特殊的情況 1 只含有乙個山峰且山峰在開頭 2 山峰在末尾 ...