1、盛水最多的容器
from typing import List
class Solution:
def maxArea(self, height: List[int]) -> int:
# 双指针初始化
l = 0
r = len(height) - 1
max_area = 0
# 循环终止条件
while l < r:
# 指针调整条件
if height[l] < height[r]:
# 指针调整前计算中间值
max_area = max(max_area, (r - l) * height[l])
l += 1
else:
max_area = max(max_area, (r - l) * height[r])
r -= 1
return max_area
2、两数之和等于目标值-有序数组
# 给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target
# 函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。
from typing import List
class Solution:
def twoSum(self, numbers: List[int], target: int) -> List[int]:
# 双指针初始化
l = 0
r = len(numbers) -1
# 循环终止条件
while l < r:
if numbers[l] + numbers[r] == target:
return [l, r]
# 调整指针
if numbers[l] + numbers[r] > target:
r -= 1
else:
l += 1
return []
3、容器资源分配
题意:假设所有虚拟机的CPU核数都为cpuCore。为了满足可靠性要求,每个虚拟机上最多部署2个容器,一个容器占用一定数量的CPU核数,一个虚拟机上容器占用的CPU核数总和不能超过cpuCore。
现有A, B两个业务,每个业务都有一个或者多个微服务,每个微服务独占一个容器。
- 承载业务A的每个容器需要CPU核数记录于serviceA,serviceA[i]表示容器i所需的CPU核数,业务B信息serviceB含义同理。
- 业务A需要支持反亲和策略,即业务A的任何两个容器不能运行在同一个虚拟机上;业务B不需要反亲和。
请计算至少需要多少个虚拟机才能满足两个业务的资源要求。
from typing import List
import bisect
class Solution:
def vm_resource(self, cpu_core: int, service_a: List[int], service_b: List[int]):
A = [cpu_core - a for a in service_a]
A.sort()
service_b.sort()
# a和b可以组合的情况
for a in A:
idx = bisect.bisect_right(service_b, a)
if idx == 0:
# 不满足组合条件
continue
service_b.pop(idx - 1)
# b单独组合的情况
l = 0
r = len(service_b) - 1
count = len(A)
while l < r:
if service_b[l] + service_a[r] <= cpu_core:
l += 1
r -= 1
count += 1
return count
s = Solution()
# 输入:
s.vm_resource(32, [16, 8, 16], [2, 7])
# 输出:3
3、总结:
双指针,左指针最左,右指针最右,左加加右减减计算临时值,直到左不小于右。