- 數組中的最長山脈
解題思路:雙指針。先找到比左右兩側大的數 然後以這個數爲中心 依次找到左右的長度
class Solution(object):
def longestMountain(self, A):
"""
:type A: List[int]
:rtype: int
"""
if len(A)<3:
return 0
res=0
for i in range(1,len(A)-1):
if A[i-1]<A[i] and A[i+1]<A[i]:
left,right=i-1,i+1
while left>0 and A[left-1]<A[left]:
left-=1
while right<len(A)-1 and A[right+1]<A[right]:
right+=1
res=max(res,right-left+1)
return res
- 從x軸的零座標出發,走出的第n步,步長爲n,即第一步移動的距離爲1,第二步移動的距離爲2。每次移動可以向左或向右移動。求最少需要走多少步才能到達target位置(target可以爲負)。若無論怎麼走都達到不了,則輸出-1。
解題思路:
牛客網大佬的思路:target爲正或負,所需要的步數是一樣的。target=abs(target)
1.求sum=1+2+…+k。是sum剛好大於target。diff=sum-target
2.若diff爲偶數,則讓diff/2反向即可,共需要k步到達target。
3.若diff爲奇數,讓任何數反向都是減少偶數距離,不會使得diff爲0。因此讓diff+k+1
4.若diff+k+1爲偶數,則根據1可知k+1步可到達target。
5.若diff+k+1爲奇數,說明k+1爲偶數,則k+2必然爲奇數,因此diff+k+1+k+2必爲偶數,即可以在k+2步時到達。
代碼:
def FindTarget(target):
target=abs(target)
i=0
sum=0
while sum<target:
i += 1
sum+=i
if sum==target:
return i
else:
diff=sum-target
if diff%2==0:
return i
else:
if (diff+i+1)%2==0:
return i+1
else:
return i+2
x=input()
print FindTarget(x)