689. 三个无重叠子数组的最大和
求 三个 无重叠的 k长度子组和最大, 那么 可以求一个 从0-i 最大值以及对应 下标, 求一个 i-末尾最大值以及对应下标, 那么 中间那个就从 k- len-k 扫过去 求max就行,然后保存下标
复杂度O(n) 不过样例不太友好 导致 时间很长,
class Solution:
def maxSumOfThreeSubarrays(self, nums: List[int], k: int) -> List[int]:
sumnum = [0]*(len(nums)-k+1)
for i in range(len(nums)-k+1):
sumnum[i] = sum(nums[i:i+k])
N = len(sumnum)
max1=[sumnum[0]]*(N)
max1under=[0]*(N)
max2=[sumnum[N-1]]*(N)
max2under=[N-1]*(N)
#sum1,sum2,sum3 =0,0,0
for i in range(1,N):
if sumnum[i] > max1[i-1]:
max1[i] = sumnum[i]
max1under[i] = i
else :
max1[i] = max1[i-1]
max1under[i] = max1under[i-1]
for i in range(N-2,-1,-1):
if sumnum[i]>=max2[i+1]:
max2[i] =sumnum[i]
max2under[i] = i
else :
max2[i] = max2[i+1]
max2under[i] = max2under[i+1]
res = 0
lis = []
for i in range(k,len(nums)-k+1-k):
# maxnum= max(maxnum,dp1[0][i-k-1]+dp1[i+k][len(nums)-k-1]+sumnum[i])
if res < sumnum[i]+max1[i-k]+max2[i+k]:
res = sumnum[i]+max1[i-k]+max2[i+k]
lis = [max1under[i-k],i,max2under[i+k]]
#print(res,lis)
return lis
530. 二叉搜索树的最小绝对差
中序遍历 遍历结果就是从小到大 然后记录值就好了
class Solution:
res = 99999
pre = 99999
def getMinimumDifference(self, root: TreeNode) -> int:
def Search(root):
if root == None:
return
Search(root.left)
self.res = min(self.res, abs(self.pre - root.val))
self.pre = root.val
Search(root.right)
Search(root)
return self.res