#561 Array Partition I
Given an integer array
nums
of2n
integers, group these integers inton
pairs(a1, b1), (a2, b2), ..., (an, bn)
such that the sum ofmin(ai, bi)
for alli
is 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
nums
and 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, return0
instead.
解题思路:
完全没看懂题目在说什么……参考了油管上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]的值。整体上简洁了很多。