可见的山峰对数量
題目:一個(gè)不含有負(fù)數(shù)的數(shù)組可以代表一圈環(huán)形山,每個(gè)位置的值代表山的高度,比如{3,1,2,4,5}、{4,5,3,1,2}或{1,2,4,5,3}都代表同樣結(jié)構(gòu)的環(huán)形山。3->1->2->4->5->3方向叫做next方向(逆時(shí)針),3->5->4->2->1->3方向叫做last方向叫做last方向(順時(shí)針)
山峰A和山峰B能夠相互看見的條件為:
1、如果A和B是同一座山,認(rèn)為互相看不見
2、如果A和B是不同的山,并且在環(huán)中相鄰,認(rèn)為可以相互看見
3、如果A和B是不同的山,并且在環(huán)中不相鄰,假設(shè)兩座山高度最小值為min。如果A通過next方向到B的途中沒有高度比min大的山峰,或者A通過last方向到B的途中沒有高度比min大的山峰,認(rèn)為A和B可以相互看見
給定一個(gè)不含負(fù)數(shù)且沒有重復(fù)值的數(shù)組arr,請(qǐng)返回有多少對(duì)山峰可以互相看見
進(jìn)階問題:給定一個(gè)不含油負(fù)數(shù)但可能含有重復(fù)值的數(shù)組arr,返回有多少對(duì)山峰能夠相互看見
要求:如果arr的長度為N,沒有重復(fù)值的情況下時(shí)間復(fù)雜度達(dá)到O(1),可能有重復(fù)值的情況下時(shí)間復(fù)雜度為O(N)
思路:數(shù)組中所有數(shù)字不一樣,環(huán)形結(jié)構(gòu)只有1座山峰,可見山峰對(duì)為0;環(huán)形結(jié)構(gòu)中只有兩座山峰時(shí),可見山峰的數(shù)量為1.環(huán)形結(jié)構(gòu)中有i座山峰時(shí)(i>2)可見山峰對(duì)的數(shù)量為2i-3.? 高度小的山峰去找高度大的山峰。
進(jìn)階代碼:
def getVisibNum(L):if L == None or len(L) < 2:return 0#找到最大值所在位置maxIndex = 0for in in range(len(L)):if L[maxIndex] < L[i]:maxIndex = istack = []stack.append([L[maxIndex],1])index = nextIndex(maxIndex,len(L))res = 0while index!=maxIndex:while stack[-1][0] < L[index]:k = stack.pop()[1]res += getNum(k) + 2*kif stack[-1][0] == L[index]:stack[-1][1] += 1else:stack.append([L[index],1])index = nextIndex(maxIndex,len(L))while len(stack) > 2:times = stack.pop()[1]res += getNum(times) + 2* timeswhile len(stack) == 2:times = stack.pop()[1]if stack[-1][1] == 1:res += getNum(times) + timeselse:res += getNum(times) + 2 * timesres + = getNum(stack.pop()[1])def nextIndex(k,size):if k < (size-1):return k + 1else:return 0def getNum(k):if k == 1:return 0 else:return (k*(k-1))/2?
總結(jié)
- 上一篇: 求最大子矩阵的大小
- 下一篇: 遍历二叉树的神级方法(Morris遍历)