当前位置: 首页 > article >正文

二分算法 (二)

文章目录

  • 题目总览
  • 题目详解
    • 3143.正方形中的最多点数
    • 410.分割数组的最大值
    • 3281.范围内整数的最大得分

题目总览

二分作为求解答案的一种中间手段
关键在于这个check函数的定义,其中的话,大多数使用到贪心,因为是二分,会一步步接近这个结果,所以开始的范围大一点没有关系

最小化最大值和最大化最小值,首先想到这个二分算法

二分作为中间手段

3143.正方形中的最多点数

最小化最大值
410.分割数组的最大值

最大化最小值

3281.范围内整数的最大得分

题目详解

3143.正方形中的最多点数

在这里插入图片描述
在这里插入图片描述

思路分析:可以看到边长的范围很长,所以使用暴力是不可能在规定时间内求解的,由于边长的变化可以单调,所以我们可以以边长为变量进行使用二分求解,对于每一次得到的mid,我们再逐一判断是否有重复的元素(使用集合进行判断)


class Solution:
    def maxPointsInsideSquare(self, points: List[List[int]], s: str) -> int:
        ans = 0
        def check(mid):
            vis = set()
            for (x,y),c in zip(points,s):
                if abs(x) <= mid and abs(y) <= mid:
                    if c in vis:
                        return False
                    vis.add(c)
            nonlocal ans 
            ans = len(vis)
            return True
        left ,right = 0,1000_000_000
        while left<=right:
            mid = (left+right)//2
            # 满足条件
            if check(mid):
                left=mid+1
            else:
                right=mid-1
        return ans
            


        

410.分割数组的最大值

在这里插入图片描述

思路分析:根据灵神的思路,
在这里插入图片描述
难点还是在于如何统计这个段数,其实只要我们从左往右,根据你传入的这个mid的值,根据是否能够累加得到,如果超过这个mid 值,则多开一段
当然,我们求解的是 这个最小的最大值,那我们就可以以这个为变量进行二分求解

class Solution:
    def splitArray(self, nums: List[int], k: int) -> int:
        ans = 0
        def check(mid):
            numk , s = 1,0
            for i in nums:
                if s + i <= mid:
                    s += i
                else:
                    # 新开一段
                    numk+=1
                    s = i 
                    if numk>k:
                        return False

            nonlocal ans
            ans = mid
            return True
        
        left,right = max(nums),sum(nums)
        # 单调性的体现,对于最大值的最小,当你划分的k越小,则越大
        while left<=right:
            mid = (left+right)//2
            # 如果满足条件,则可以变小看看
            if check(mid):
                right=mid -1
            else:
                left=mid +1
        return left
        

3281.范围内整数的最大得分

在这里插入图片描述

思路分析:关键点还是在于check函数的定义,在这里是判断是否满足对于选择的数字是否满足这个区间的要求

class Solution:
    def maxPossibleScore(self, start: List[int], d: int) -> int:
        # 先按照升序排序
        start.sort()
        # check函数是使用贪心策略来构建的
        def check(mid):
            s = start[0]
            for i in range(1,len(start)):
                # if start[i] <= s + mid and s+mid <= start[i]+d:
                # 这个s+mid 不一定大于start[i]
                if s+mid <= start[i]+d:
                    s = max(start[i],s +mid)
                else:
                    return False
            return True
        left,right = 0, 2000_000_001
        # 贪心思想,如果此时的mid满足,表示至少可以满足
        while left<=right:
            mid = (left+right)//2
            if check(mid):
                left=mid+1
            else:
                right=mid-1
        return right

http://www.kler.cn/a/521850.html

相关文章:

  • C++,STL,【目录篇】
  • SSM开发(七) MyBatis解决实体类(model)的字段名和数据库表的列名不一致方法总结(四种方法)
  • LTV预估 | 深度学习PLTV之开山鼻祖ZILN
  • python学opencv|读取图像(四十九)使用cv2.bitwise()系列函数实现图像按位运算
  • Airflow:精通Airflow任务依赖
  • 每日 Java 面试题分享【第 14 天】
  • Springboot使用复盘
  • 计算机视觉算法实战——车辆速度检测
  • Linux常见问题解决方法--1
  • 度小满Java开发面试题及参考答案 (上)
  • 62.异步编程+Prism
  • 数据结构实战之线性表(一)
  • 【算法】多源 BFS
  • YOLOv8:目标检测与实时应用的前沿探索
  • HTML5使用favicon.ico图标
  • android 的aab包
  • 2015年蓝桥杯第六届CC++大学B组真题及代码
  • 利用Python中Scapy库分析网络性能
  • 1月27(信息差)
  • 当高兴、尊重和优雅三位一体是什么情况吗?
  • ShenNiusModularity项目源码学习(7:数据库结构)
  • 前端监控之rrweb录制用户行为
  • 【学术会议征稿】第五届能源、电力与先进热力系统学术会议(EPATS 2025)
  • 18. 四数之和【力扣】——两层循环后的双指针法
  • 开启eslint后,html中全角符号绕过eslint检测
  • .NET Core 中依赖注入的使用