#561 Array Partition I
Given an integer array
numsof2nintegers, group these integers intonpairs(a1, b1), (a2, b2), ..., (an, bn)such that the sum ofmin(ai, bi)for alliis maximized. Return the maximized sum.
解题思路:
能获得pair里min之和的最大值策略是从小到大排列,然后取idx为偶数的值后求和。
class Solution:
def arrayPairSum(self, nums: List[int]) -> int:
nums.sort()
sum = 0
for i in range(len(nums)):
if i % 2 == 0:
sum += nums[i]
return sum
关于list.sort()和sorted(list)总是会搞混哪个会生成新的list。再查了一下:

是list.sort()会改变原list,sorted(list)会生成新的list。
runtime:

参考248的解法:

还可以直接用[::2] 提取所有最小值哦。给忘了。学会用起来这个方法。
#509 Minimum Size Subarray Sum
Given an array of positive integers
numsand a positive integertarget, return the minimal length of a contiguous subarray[numsl, numsl+1, ..., numsr-1, numsr]of which the sum is greater than or equal totarget. If there is no such subarray, return0instead.
解题思路:
完全没看懂题目在说什么……参考了油管上Neetcode的视频。其思路是sliding window。
用two pointer left与right 初始设定为零,然后用sum 先求出nums[left]的值。
然后while 设定的终止条件是left已经走到了最后一位。当sum大于或等于target时,记录right-left+1的值,这个就是sliding window的长度。并每次取上一次length,和这次的长度相比取最小值。length在while循环前设定为正无穷。然后left +1,sum减去nums[left-1]; 反之, right +1,sum加上nums[right]。 如果right还没走出数列的话。走出就终止循环。
当left走到最后一位,看length是不是还是正无穷:如果是,说明一直没有遇到符合条件的subarray,则返回0;如果不是,那就输出length。
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
left = right = 0
length = float('inf')
sum = nums[left]
while left < len(nums):
if sum >= target:
length = min(right-left+1, length)
left += 1
sum -= nums[left-1]
else:
right += 1
if right < len(nums):
sum += nums[right]
else:
break
return length if length != float('inf') else 0
runtime:

最快47ms的解法,思路和我差不多。
但有几个地方值得学习:
1.正无穷的表达可以是math.inf,负无穷的表达可以是 -math.inf
2.用for循环来代替我right右移的步骤,结果直接加上nums[right]的值。整体上简洁了很多。
这篇博客分享了两道LeetCode算法题目的解题思路,分别是#561 Array Partition I,通过排序和选择偶数下标元素最大化配对和,以及#509 Minimum Size Subarray Sum,使用滑动窗口找到和大于等于目标值的最小子数组。文章提到了解题策略和优化技巧,并提供了运行时间分析。
1200

被折叠的 条评论
为什么被折叠?



