維護(hù)一組cp,存放當(dāng)前最合適的前兩個(gè)。
1.如果當(dāng)前讀到的數(shù),比第二個(gè)還大,輸出True。
2.如果比第二個(gè)小,比第一個(gè)大,更新第二個(gè)為當(dāng)前的數(shù)。
3.如果當(dāng)前數(shù)比第一個(gè)小,更新第一個(gè)為當(dāng)前數(shù)。
對(duì)于例子[2,3,1]
如果依照規(guī)則3,會(huì)找到[1,3]這樣一個(gè)子序列,這明顯是錯(cuò)的,但是卻不影響最終的結(jié)果。(我們只關(guān)心當(dāng)前是否有長(zhǎng)度為2的序列,第二個(gè)數(shù)是多少,而第一個(gè)數(shù)是多少是不關(guān)心的)
class Solution(object):
def increasingTriplet(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
if len(nums)<3:
return False
best_cp=[float("inf"),float("inf")]
for num in nums:
if num > best_cp[1]:
return True
if num<best_cp[0]:
best_cp[0]=num
continue
if num>best_cp[0] and num<best_cp[1]:
best_cp[1]=num
return False
窮舉法(不符合要求):
class Solution(object):
def increasingTriplet(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
if len(nums)==0:
return False
for i1 in range(len(nums)-2):
if nums[i1]>nums[i1+1]:
continue
for i2 in range(i1+1,len(nums)):
if nums[i2]<=nums[i1]:
continue
for i3 in range(i2+1,len(nums)):
if nums[i3] >nums[i2]:
return True
return False
維護(hù)兩個(gè)cp,一個(gè)表示當(dāng)前最好的cp,一個(gè)表示可能取代它的cp。分了很多情況,但總算是搞定了。
class Solution(object):
def increasingTriplet(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
best_cp=[None,None]
cur_cp=[None,None]
for num in nums:
#print(num)
#print(best_cp)
#print(cur_cp)
if best_cp[0] is None:
best_cp[0]=num
continue
if best_cp[1] is None:
if num<best_cp[0]:
best_cp[0]=num
if num>best_cp[0]:
best_cp[1]=num
continue
if num > best_cp[1]:
return True
if num == best_cp[1]:
continue
if num > best_cp[0]:
best_cp[1]=num
continue
if cur_cp[0]==None:
cur_cp[0]=num
if num<cur_cp[0]:
cur_cp[0]=num
if num>cur_cp[0]:
cur_cp[1]=num
if cur_cp[1] is not None:
if cur_cp[1] < best_cp[1]:
best_cp=cur_cp[:]
else:
cur_cp[:]=[None,None]