题意: Given an unsorted array return whether an increasing subsequence of length 3 exists or not in the array.
Formally the function should:
Return true if there exists i, j, k
such that arr[i] < arr[j] < arr[k] given 0 ≤ i < j < k ≤ n-1 else return false.
Your algorithm should run in O(n) time complexity and O(1) space complexity.
Examples:
Given [1, 2, 3, 4, 5],
return true.
Given [5, 4, 3, 2, 1],
return false.
思路:我一开始的思路是这样的,先找到数组中最小的数,在从最小数位置到数组末尾找到最大数的索引,如果两个索引中间有大于最小数并且小于最大数的话就返回True,但是我发现我就是个sb。。。这题明明要考虑就是数的相对大小,先放上我自己错的代码:
class Solution(object):
def increasingTriplet(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
max_idx,min_idx=0,0
max_num,min_num=float('-inf'),float('inf')
for i in xrange(len(nums)):
if nums[i]<min_num:
min_idx, min_num = i, nums[i]
for i in xrange(min_idx+1,len(nums)):
if nums[i]>=max_num:
max_idx, max_num = i, nums[i]
print min_idx,max_idx
for i in xrange(min_idx,max_idx):
if min_num<nums[i]<max_num:
return True
return False
反例:[1,0,2,0,-1,-1,-1,-1,3],来看看别人的代码吧,直接if-else就解决了,哎。。。。if-else其实就有递推的关系在里面。
class Solution(object):
def increasingTriplet(self,nums):
first = second = float('inf')
for n in nums:
if n <= first:
first = n
elif n <= second:
second = n
else:
return True
return False