Python-算法编程100例-双指针(入门级)

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、总结:

双指针,左指针最左,右指针最右,左加加右减减计算临时值,直到左不小于右。

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值