二分算法自我总结与反思(上)

一.二分查找

1.含义:二分查找(Binary Search)是一种高效的查找算法,核心是每次将查找范围减半,仅适用于已排序的数组或区间,时间复杂度为O(log n)。

2.操作过程:以在一个升序数组中查找一个数为例。它每次考察数组当前部分的中间元素,如果中间元素刚好是要找的,就结束搜索过程;如果中间元素小于所查找的值,那么左侧的只会更小,不会有所查找的元素,只需到右侧查找;如果中间元素大于所查找的值,只需要到左侧查找。

3.前提:有序

注:当中间位置的数不是我们所查找的数时,注意接下来应该往那边找

4.以下是基础二分查找代码示例:

int bs(vector<int>& a, int n, int target) { int l = 0, r = n - 1; while (l <= r) { int mid = l + (r - l) / 2; if (a[mid] == target) { return mid;//无重复目标值时 } else if (a[mid] > target) { r = mid - 1; } else { l = mid + 1; } } return -1; }

二.二分答案---猜答案(二分查找的应用)

1.做题步骤:确定题目是二分的题目->确定答案的范围->假定一个解判断是否可行

2.题目类型:最值问题(可能要用二分,例题https://www.luogu.com.cn/problem/P1873https://leetcode.cn/problems/nZZqjQ/) 最小化最大值以及最大化最小值问题(大概率用二分)

3.例题1.https://www.luogu.com.cn/problem/P1873

根据题目可以知道:给定n棵树的高度,求一个最大的参数值h,使他把所有树h以上的部分砍掉以后,能得到m米或者以上的木材。换句话说,如果再升高 1 米,他将得不到 M 米木材。

那我们可以二分树的高度0-400000,然后在check函数中去判断是否可行,即算一下得到的木材是否满足m。

以下是例题代码:

#include<iostream> #include<limits> #include<algorithm> #include<vector> #define neg_inf LLONG_MIN #define inf LLONG_MAX #define int long long using namespace std; int check(int mid,vector<int>&a,int m) { int sum = 0; int n = a.size(); for (int i = 0; i < n; i++) { if (a[i]> mid) {//如果当前的树的高度大于高度h,那么就可以加入当前sum sum += a[i] - mid; } } if (sum >= m) { return 1; } else { return 0; } } void solve() { int n, m; cin >> n >> m; vector<int>h(n); for (int i = 0; i < n; i++) { cin >> h[i]; } int l = 0, r = 400000,ans=-1; while (l <= r) {//二分 高度h范围0--400000 int mid = (l + r) / 2; if (check(mid, h, m)) {//检查是否大于等于m l = mid + 1;//如果成立那么继续向右查找 ans = mid; } else { r = mid - 1;//如果不成立那么就向左查找 } } cout << ans << endl; } signed main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int t; cin >> t; while (t--) { solve(); } return 0; } 

4.例题2https://leetcode.cn/problems/nZZqjQ/

我们二分吃香蕉的速度,然后去以这个速度为标准吃香蕉头。使用一个judge判断这个解是不是可行解。 由于每小时都要吃香蕉,即每小时至少吃 1个香蕉,因此二分查找的下界是 1;由于每小时最多吃一堆香蕉,即每小时吃的香蕉数目不会超过最多的一堆中的香蕉数目,因此二分查找的上界是最多的一堆中的香蕉数目。 这个judge怎么实现呢?用每堆香蕉的个数除以速度,得到吃完该堆香蕉的时间。然后把每堆时间相加(t)和h比较,如果t<=h,说明速度还可以更小,调整上界。否则说明速度太慢了,需要变大,调整下界。

以下是例题代码:

#include<iostream> #include<limits> #include<algorithm> #include<vector> #define neg_inf LLONG_MIN #define inf LLONG_MAX #define int long long using namespace std; bool check(vector<int>& piles, int h,int k) { int t=0; int n = piles.size(); for (int i = 0; i < n; i++) { t += piles[i] / k; if (piles[i] % k != 0) { t++; } } if (t <= h) { return 1; } else { return 0; } } int minEatingSpeed(vector<int>& piles, int h) { int l = 1, r = 0; int n = piles.size(); for (int i = 0; i < n; i++) { r = max(piles[i], r); } int ans = -1; while (l <= r) { int mid = (l + r) / 2; if (check(piles, h,mid)) { r = mid - 1; ans = mid; } else { l = mid + 1; } } return ans; } void solve() { int n, h; cin >> n >> h; vector<int>p(n); for (int i = 0; i < n; i++) { cin >> p[i]; } int k = minEatingSpeed(p, h); cout << k << endl; } signed main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int t; cin >> t; while (t--) { solve(); } return 0; } 

Read more

用 Codex + GitHub Spec-Kit 做一次“规格驱动开发”实战

用 Codex + GitHub Spec-Kit 做一次“规格驱动开发”实战

* 用 Codex + GitHub Spec-Kit 做一次“规格驱动开发”实战 * 1) 初始化:把 spec-kit 工作区真正建起来(多种方式) * 方式 A:uvx 一次性运行(推荐) * 方式 B:uv tool install(全局安装 specify) * 方式 C:pipx 安装(Python 工具常用法) * 2) 初始化后,正确的目录结构长什么样( * 3) 在 Codex 里跑 speckit:统一输入规则(非常重要) * 4) 标准流水线:Constitution → Spec → Plan → Tasks → Implement * Step 1:

By Ne0inhk
VSCode Github Copilot使用OpenAI兼容的自定义模型方法

VSCode Github Copilot使用OpenAI兼容的自定义模型方法

背景 VSCode 1.105.0发布了,但是用户最期待的Copilot功能却没更新!!! (Github Copilot Chat 中使用OpenAI兼容的自定义模型。) 🔥官方也关闭了Issue,并且做了回复,并表示未来也不会更新这个功能: “实际上,这个功能在可预见的未来只面向内部人员开放,作为一种“高级”实验功能。是否实现特定模型提供者的功能,我们交由扩展作者自行决定。仅限内部人员使用可以让我们快速推进,并提供一种可能并非始终百分之百完善,但能够持续改进并快速修复 bug 的体验。如果这个功能对你很重要,我建议切换到内部版本 insider。” 🤗 官方解决方案:安装VSCode扩展支持 你们完全不用担心只需要在 VS Code 中安装扩展:OAI Compatible Provider for Copilot 通过任何兼容 OpenAI 的提供商驱动的 GitHub Copilot Chat,使用前沿开源大模型,如 Kimi K2、DeepSeek

By Ne0inhk
使用 VS Code 将项目代码上传到 Gitee 的完整指南

使用 VS Code 将项目代码上传到 Gitee 的完整指南

在现代软件开发流程中,版本控制是不可或缺的一环。 Gitee(码云)作为国内领先的代码托管平台,为开发者提供了稳定、快速的 Git 服务。 本文将详细介绍如何使用 Visual Studio Code(VS Code)将本地项目代码上传至 Gitee 仓库,涵盖从环境配置、初始化仓库到推送代码的完整流程。 一、准备工作 1. 安装必要工具 * Git:确保你的系统已安装 Git。 可通过终端运行 git --version  或 git -v 验证是否安装成功。 * VS Code:下载并安装 Visual Studio Code。 * Gitee 账号:前往 Gitee 官网 注册账号(如尚未注册)。 2. 安装 VS

By Ne0inhk
使用Git将代码从远程仓库拉取到本地(详细图解、简单易懂)

使用Git将代码从远程仓库拉取到本地(详细图解、简单易懂)

目录 一、前言 二、全流程 一、前言 本博客主要记录一下使用Git将代码从远程仓库拉取到本地的全流程,使用Git拉取代码在学校内多同学合作开发项目或者是实习拉取公司代码等场景都很常见,单纯记录希望对你有帮助 二、全流程 首先在你想要存放代码的位置新建一个文件夹并改名 进入刚刚创建的空文件中,右键然后点击显示更多选项 然后点击Git Bash Here 然后就会出现如图所示的命令行窗口 此时先不用管命令行窗口,找到你要远程仓库所在的平台(我这里以Gitee演示),如图点击克隆/下载按钮 HTTPS下方就是远程仓库的url地址,只要有远程仓库的url地址,只需要在刚刚的命令行窗口打上git clone在将url地址复制在后面再回车即可(Gitee下面的提示也给了,直接复制带git clone的命令就行,没有的话就自己敲git clone) 复制到命令行窗口之后,等待片刻即可 然后点开刚刚创建的文件夹就可以看到拉取下来的代码了,后续用IDEA打开该文件就可以在本地进行开发了

By Ne0inhk