題目:乙個不含有負數的陣列可以代表一圈環形山,每個位置的值代表山的高度,比如{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 山峰在末尾 ...