二分算法(优化)

二分算法

一、前言

今天又是一个优化算法------二分算法

二、二分

2.1 概述

在一个有序数组中查找一个数。

每次考察数组当前部分的中间元素,如果中间元素刚好是要找的,就结束搜索过程;如果中间元素小于所查找的值,那么左侧的只会更小,不会有所查找的元素,只需到右侧查找;如果中间元素大于所查找的值,同理,只需到左侧查找。

2.2 代码

cpp 复制代码
int binarySearch(int a[],int size,int target)
{
    int l=0,r=size-1;
    int ans=-1;
    while(l<=r)
    {
        int mid=l+(r-l)/2;
        if(a[mid]>=target)
        {
            ans=mid;
            r=mid-1;
        }
        else
        {
            l=mid+1;
        }
    }
    return ans;
}

注意

  • 不能背板子,二分很++灵活++!!!
  • 边界条件(while循环条件)是和循环内容配套的,很容易写着写着陷入死循环

时间复杂度O(logn)

2.3 常见题型

  • 查找某个数的位置

    洛谷:P2249 【深基13.例1】查找

  • 枚举答案,但降低时间复杂度,判断一个解是否可行(猜答案)

  • 最小化最大值/最大化最小值以及其他求最值问题

    洛谷

    • P2678 [NOIP 2015 提高组] 跳石头(最大化最小值)
    • P1873 [COCI 2011/2012 #5] EKO / 砍树(最大化最小值)
    • P1824 [USACO05FEB] 进击的奶牛 Aggressive Cows G(最大化最小值)

    leetcode:875.爱吃香蕉的珂珂(最小化最大值)

    解题过程

    • 无论是最小化最大值还是最大化最小值,先明白题目让求的是什么
    • 确定答案区间,二分答案(确定二分的区间),假设mid就是答案
    • 接着根据题设条件(题目中的其他参数)继续和mid比较,更新mid,最终得解

2.4 补充

在C++头文件algorithm中,有两个函数底层就是二分,在解题中使用起来很方便

cpp 复制代码
#include<algorithm>
// qian'd
lower_bound(arr.begin(), arr.end(), val);	
// 在[begin, end)中找到第一个位置并返回其地址,使得val插入在这个位置前面
upper_bound(arr.begin(), arr,end(), val);
// 在[begin, end)中找到最后一个位置并返回其地址,使得val插入在这个位置前面

三、小结

关于二分,一定要注意循环条件,不然容易陷入死循环

本篇结合灵神题单,洛谷官方书籍等以及我自己的见解而来~

相关推荐
驱动探索者21 小时前
linux mailbox 学习
linux·学习·算法
ringking12321 小时前
autoware-1:安装环境cuda/cudnn/tensorRT库函数的判断
人工智能·算法·机器学习
进阶小白猿21 小时前
Java技术八股学习Day33
java·开发语言·学习
大闲在人1 天前
8. 供应链与制造过程术语:产能
算法·制造·供应链管理·智能制造·工业工程
橘颂TA1 天前
【测试】高效浏览器操作:基础功能与优化设置大全
c++·功能测试·职场和发展·测试·web测试
一只小小的芙厨1 天前
寒假集训笔记·以点为对象的树形DP
c++·算法
历程里程碑1 天前
普通数组----合并区间
java·数据结构·python·算法·leetcode·职场和发展·tornado
艾莉丝努力练剑1 天前
hixl vs NCCL:昇腾生态通信库的独特优势分析
运维·c++·人工智能·cann
执风挽^1 天前
Python基础编程题2
开发语言·python·算法·visual studio code
我在人间贩卖青春1 天前
C++之new和delete
c++·delete·new