一、原题目
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.
Note: Your algorithm should run in O(n) time complexity and O(1) space complexity.
二、题目大意
给定一个列表,判断再列表中是否存在三个元素满足arr[i]<arr[j]<arr[k]且i<j<K,存在就返回True
否则返回False.但是对算法的时间和空间有要求,
三、思路分析
别人的思路:
设定两个前两个值,通过前两个的值的变化来第三个值,如果第三个值存在,返回True
否则返回False.
本人的思路:
通过求取三次最大值,来比较他们的下标是否满足要求。具体步骤是:第一次在nums中求取最大值,存储这个值的下标;第二次在上次取过的剩余列表元素中,再取最大值;第三次取剩余的剩余的最大值。看三次存储的下标是否满足要求。这个思路看起来行,但是仔细想想还是不行的?您或许可以想想?
四、具体代码
作者的代码:
class Solution:
def increasingTriplet(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
if nums == None or len(nums) < 3:
return False
else:
min = nums[0]
mid = None
for n in nums[1:]:
if mid != None:#找第三个数
if n > mid:#比第二个数大,符合要求
return True
elif mid > n > min:#很自然,但是光想不够,得写讨论 下降
mid = n
elif min > n:#上升
min = n
else:#找第二个数
if n > min:
mid = n
elif n < min:
min = n
return False
本人的代码:
class Solution:
def increasingTriplet(self, nums: List[int]) -> bool:
if len(nums)<3:
return False
k=nums.index(max(nums))
del nums[k]
j=nums.index(max(nums))
del nums[j]
i=nums.index(max(nums))
if i<j and j<k:
return True
else:
return False
五、两者差别
1本人的思路行不通是因为删除了元素,删除元素意味着列表长度的改变,相应的下标值就会随之改变,所得到的结果自然就是无效数据。
2.作者通过三个值的关系,一步一步得到结果,思路很清晰。但是讨乱很多,没有做记录较难在头脑中想清楚。
六、知识点总结
1.对列表的下标有要求的时候,禁止删除列表元素,防止出现无效数据。
2.用纸记录讨论情况,有些讨论太多,单独想想不清。
七、.来源
题目连接:https://leetcode.com/problems/increasing-triplet-subsequence/
座右铭:站在别人的思想上,看见自己的不足,传播错误的经验,愿君不重蹈覆辙。
由于受限于本人经验,难免不足,如有建议,欢迎留言交流。
说明:作者代码能通过测试,本人亲测。如果喜欢,请点赞,您的鼓励是本人前进的最好动力。
---------------------
作者:路漫漫,远修兮
来源:CSDN
原文:https://blog.csdn.net/qq_41827968/article/details/88756403
版权声明:本文为博主原创文章,转载请附上博文链接!