今天是一道中等题,题目其实不难,但是容易超时,我前前后后改进了好几次,继续超时,最后“借鉴了答案”:
题目
我的超时代码,我已经觉得很省时了!!,用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²)但是也是靠着的,但是就是超时。
执行结果
结语:
希望有朝一日我也能成为大佬!!!