学院leetcode打卡第二天

今天是一道中等题,题目其实不难,但是容易超时,我前前后后改进了好几次,继续超时,最后“借鉴了答案”:

题目

我的超时代码,我已经觉得很省时了!!,用maxnum记录前面一部分最大值,minnum记录后面最小值。

maxnum,遍历一个对照一下是否大于maxnum,大于则更新

minnum,遍历一个如果小于等于这个才去遍历后一部分找到新的最小值,否则不用更新(超时应该就在这里,但是我觉得已经剪枝了很多了,不用每次去遍历寻找最小值了)

class Solution:
    def partitionDisjoint(self, nums: List[int]) -> int:
        l=len(nums)
        maxnum=nums[0]
        minnum=10e6
        for i in range(l):
             if nums[i]<=minnum:#如果此时的值小于minnum,则再找出后一部分的最小值(意思是会往后迭代,如果迭代的那一个是最小值,则重新找最小值,不是的话,就不用找了就是这一个)
                minnum=10e6#更新minnum,防止后面没有比nums【i】小的值了
                for j in range(i+1,l):#找出后一部分最小值
                    minnum=min(minnum,nums[j])
            maxnum=max(maxnum,nums[i])#找出前一部分最大值
            if maxnum<=minnum:
                return i+1
            
        

官方解答:

class Solution:
    def partitionDisjoint(self, nums: List[int]) -> int:
        n = len(nums)
        cur_max = left_max = nums[0]
        left_pos = 0
        for i in range(1, n - 1):
            cur_max = max(cur_max, nums[i])
            if nums[i] < left_max:#大于就更新,否则就默认满足条件
                left_max, left_pos = cur_max, i
        return left_pos + 1

这个思想确实很棒,一次遍历就足够了,直接o(n)拿下,我的虽然说不会是完全O(n²)但是也是靠着的,但是就是超时。

执行结果

结语:

希望有朝一日我也能成为大佬!!!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值