2、二分和贪心

news2025/3/27 15:32:43

一、二分

这里有个小技巧,你会发现,只要是求最大最小最多等等的贪心过程,我们就有3种方法:①二分②贪心算法③动态规划
我们先讲二分和贪心,动态规划比较麻烦,留到后期。

1、了解

在这里插入图片描述

2、模版

class Solution {
public:
    int search(vector<int>& nums, int target) {
        // 二分查找的前提是数组必须是有序的
        int left = 0;                  // 左边界,初始为数组起始位置
        int right = nums.size() - 1;   // 右边界,初始为数组末尾位置

        // 当左边界小于等于右边界时,继续查找
        while (left <= right) {
            int mid = left + (right - left) / 2; // 计算中间位置,避免溢出

            if (nums[mid] == target) {
                // 如果中间值等于目标值,直接返回中间位置
                return mid;
            } else if (nums[mid] < target) {
                // 如果中间值小于目标值,说明目标值在右半部分
                left = mid + 1; // 移动左边界
            } else {
                // 如果中间值大于目标值,说明目标值在左半部分
                right = mid - 1; // 移动右边界
            }
        }

        // 如果未找到目标值,返回 -1
        return -1;
    }
};

以下是提供的C++二分查找代码的分析和说明:


代码分析

这段代码实现了标准的二分查找算法,结构清晰且符合最佳实践。关键点如下:

  1. 有序数组处理

    • 明确说明输入数组必须有序(符合二分查找的前提条件)。
  2. 边界初始化

    int left = 0;
    int right = nums.size() - 1;
    
    • 初始化左右指针为数组的起始和末尾位置,逻辑正确。
  3. 循环条件

    while (left <= right)
    
    • 使用 <= 确保区间内仅剩一个元素时仍能进入循环,避免漏查。
  4. 中间值计算

    int mid = left + (right - left) / 2;
    
    • 避免 (left + right) 的潜在溢出问题,更安全的写法。
  5. 条件分支

    • 找到目标值时直接返回索引。
    • 未找到时调整左右边界,逐步缩小搜索范围,逻辑正确。

测试用例验证

示例 1:目标存在
  • 输入:nums = [-1, 0, 3, 5, 9, 12], target = 9
  • 执行流程:
    1. left=0, right=5mid=2(值为3)→ 3 < 9 → left=3
    2. left=3, right=5mid=4(值为9)→ 命中,返回4。
  • 输出:4(正确)
示例 2:目标不存在
  • 输入:nums = [-1, 0, 3, 5, 9, 12], target = 2
  • 执行流程:
    1. mid依次计算为2、0、1 → 最终 left > right,退出循环。
  • 输出:-1(正确)

边界情况测试

  1. 空数组

    vector<int> nums = {};
    int target = 5;
    
    • 直接返回 -1,正确处理。
  2. 单元素数组

    vector<int> nums = {5};
    int target = 5;  // 返回0
    int target = 2;  // 返回-1
    
    • 结果符合预期。
  3. 目标在两端

    vector<int> nums = [2, 4, 6];
    int target = 2;  // 返回0
    int target = 6;  // 返回2
    
    • 均正确命中。

总结

代码完全正确,涵盖了二分查找的核心逻辑,且处理了所有边界情况。适用于有序数组的快速查找,时间复杂度为 O(log n),空间复杂度为 O(1)

3、例题

  • ACwing分巧克力
    • 这道题的思路:
      • 假设需要的大小是 1-N中的某一个数,这里的N就是 n的数据范围最大值。我从这个数里找中间值,作为所有巧克力的边长,看满足这个边长的情况下,我能拿到多少块巧克力。
      • 如果拿到的巧克力的数量小于 小朋友人数,说明我们需要扩大巧克力数量,就要缩减边长的长度,移动 r = mid-1 。反之,大于就移动 l =mid+1 。
      • 最终结果就是 l -1 。之所以 l要减一,是因为我上面的式子是 l=mid+1 ,但实际上答案是 mid 。所以我们l要减一 。

二、贪心

1、了解

  • 举例了解:如果你需要从一个数组中,找到2个数之和是最大的 ,那么我们就找最大的数,就行了。
    • 也就是说,我们需要什么最大,就找什么的最大值。
  • 贪心是一种思想,而不是一个模版之类的题。其实在算法中,模版只是其次,你要的是做题思想,这个需要做题提升。

2、例题

  • ACwing1522排成最小的数字
  • 首先要知道什么是前导0和后导0
    • 前导零

      • 定义:出现在字符串或数字最左侧的无效零 。
      • 示例
        • 数字 00123 的前导零是开头的两个 0,有效部分是 123。
    • 后导0

      • 定义:出现在字符串或数字最右侧的无效零。
      • 示例
        • 数字 0012300 的后导零是尾部的两个 0,有效部分是 00123。
    • 题解过程:

      • 我们要先排序,再处理前导0 。为什么呢?
        • 因为:当我给你 0-010-0234的3个数字时。假设排序后是00100234,那么我们只删除前2个0,最终为100234。如果先删,就可能出现,你不知道删哪一个,或者你删成每个数字的第一个0.就会导致错误。
      • 因为这个排序具有反对称性、传递性、完整性。用 return a + b < b + a; 的方法排序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2321751.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QuecPython 网络协议之TCP/UDP协议最祥解析

概述 IP 地址与域名 IP 地址是网络中的主机地址&#xff0c;用于两台网络主机能够互相找到彼此&#xff0c;这也是网络通信能够成功进行的基础。IP 地址一般以点分十进制的字符串来表示&#xff0c;如192.168.1.1。 ​ 我们日常访问的网站&#xff0c;其所在的服务器主机都有…

ISIS-2 邻居建立关系

上一章我们介绍了ISIS的基础概念以及报文内容和作用在什么样的场景下面的 这一章我们来介绍IS-IS的邻居建立关系 一、概念 IS-IS中路由器的角色可分为L1、L2、L1/2这三种类型其中的L1/L2有点类似与我们OSPF中的ABR IS-IS中的邻居关系分为L1与L2邻居关系,其中所有建立L2邻居关…

Nature Machine Intelligence 嵌入式大语言模型使机器人能够在不可预测的环境中完成复杂的任务

近期英国爱丁堡大学发表Nature Machine Intelligence研究工作&#xff0c;提出了一种名为ELLMER&#xff08;具身大型语言模型支持机器人&#xff09;的创新框架&#xff0c;通过整合大型语言模型&#xff08;如GPT-4&#xff09;、检索增强生成&#xff08;RAG&#xff09;、视…

Springboot整合elasticsearch详解 封装模版 仓库方法 如何在linux里安装elasticsearch

目录 版本 下载地址 ElasticSearch频繁报503错误 开放 9300 和 9200 两个端口 测试联通性 改动包装类 elasticsearchTemplate getAllRespRepository 封装elasticsearchService 业务逻辑 版本 首先要对应版本 这是我在官网找到的版本信息 一定要 springboot 和 es 相…

【矩阵快速幂】P6601 「EZEC-2」机器|普及+

本文涉及知识点 【矩阵快速幂】封装类及测试用例及样例 P6601 「EZEC-2」机器 题目背景 tlx 喜欢科幻小说。 小宇宙中只剩下漂流瓶和生态球。漂流瓶隐没于黑暗里,在一千米见方的宇宙中,只有生态球里的小太阳发出一点光芒。在这个小小的生命世界中,几只清澈的水球在零重力环…

FPGA助力智能机器人应用

今年开年AI机器人引爆科技圈&#xff0c;都说FPGA是“万能芯”&#xff0c;在AI方向上已经挣扎了几年&#xff0c;仍旧不能“破圈”&#xff0c;那么在机器人方向呢&#xff1f; 个人观点我是不太看好目前FPGA能在机器人方面能“破圈”&#xff0c;但是一切皆有可能&#xff0c…

如何在jupyter notebook中使用django框架

(最好以管理员身份进入&#xff0c;否则在安装某些内容时会报错) 一.创建一个名为new_env虚拟环境 输入以下指令创建名为new_env的虚拟环境&#xff1a; conda create -n new_env python3.8 回车&#xff0c;出现以下内容&#xff0c;输入y确认安装&#xff0c;等待安装完毕…

Axure RP9.0教程: 多级联动【设置选项改变时->情形->面板状态】(给动态面板元件设置相关交互事件的情形,来控制其他面板不同的状态。)

文章目录 引言I 多级联动(省、市、区)实现思路添加三省、市、区下拉列表给省下拉框添加数据源将市、区下拉框添加不同状态,分别以省、市命名给省下拉控件设置选项改变时的交互事件省下拉控件的交互事件情形市下拉交互事件的配置II 知识扩展: 展示省 → 地级市 → 区县的多级…

Rabbitmq消息被消费时抛异常,进入Unacked 状态,进而导致消费者不断尝试消费(下)

一、消费流程图 消息在消费出现异常的时候&#xff0c;将一直保留在消息队列&#xff0c;所以你会看到以下奇怪的现象&#xff1a; 消息队列仅有5个消息&#xff0c; 投递速度也非常快&#xff0c;结果却一直无法消费掉。 二、重试策略 重试机制的使用场景&#xff1a;重试机制…

AI 的“幻觉”现象:深入解析 Hallucination 的成因与应对之道

文章目录 一、啥是 AI 的 Hallucination&#xff1f;二、啥时候容易出现幻觉&#xff1f;1. 知识边界之外的问题2. 模糊或不明确的输入3. 生成长篇内容4. 多模态任务中的误解5. 过度自信的语气要求 三、幻觉为啥会出现&#xff1f;原理是啥&#xff1f;1. 概率预测的本质2. 训练…

核心知识——论文详解

引入 在2010年&#xff0c;来自Berkeley的博士生 Matei Zaharia 发表了一篇论文《Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing》。伴随着这篇论文的&#xff0c;是一个开源系统&#xff0c;也就是 Spark。在之后的几年里&…

LeetCode hot 100 每日一题(15)——48.旋转图像

这是一道难度为中等的题目&#xff0c;让我们来看看题目描述&#xff1a; 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 提示…

屏幕后处理Post-Processing安装及使用

一、安装Post-Processing插件 在 Window --- PackageManager 中搜索并安装 Post-Processing 二、添加后处理效果步骤 给场景中的相机Camera添加 Post - process Layer&#xff0c;只有添加了该组件的相机才会进行相应的后处理&#xff0c;此组件允许您为该后处理层配置抗锯齿…

探索Halo:不止是博客,更是创作新宇宙

开篇&#xff1a;邂逅 Halo 作为一名热爱写作与分享的博主&#xff0c;拥有一个称手的博客系统一直是我的追求。在探索博客系统的旅程中&#xff0c;我尝试过不少平台&#xff0c;从 WordPress 到 Hexo &#xff0c;每一次转换都是为了寻找那个最完美的 “写作伴侣”。 WordP…

吐血整理:Air8201如何使用LuatOS进行电源管理功能!

在物联网应用场景中&#xff0c;设备续航能力直接影响其部署成本与运维效率。LuatOS操作系统通过软件层面的精细化控制&#xff0c;为Air8201提供了灵活且高效的电源管理策略。本文将从系统架构、API接口、实战配置三个维度&#xff0c;解析如何利用LuatOS实现Air8201的智能电源…

开源视觉语言模型MiniMax-VL-01:动态分辨率+4M超长文本,性能比肩GPT-4o

在人工智能领域&#xff0c;构建能够像人类一样理解、思考和行动的智能体&#xff08;AI Agent&#xff09;一直是研究人员的终极目标之一。而实现这一目标的关键在于模型是否具备足够强大的感知能力、记忆能力和推理能力。近期&#xff0c;国内人工智能公司MiniMax重磅开源了其…

Java面试第十三山!《设计模式》

大家好&#xff0c;我是陈一。如果文章对你有帮助&#xff0c;请留下一个宝贵的三连哦&#xff5e; 万分感谢&#xff01; 一、设计模式入门指南 1. 什么是设计模式&#xff1f; 设计模式是可复用的解决方案模板&#xff0c;用于解决软件开发中常见的架构问题。如同建筑领域的…

vue 点击放大,图片预览效果

背景&#xff1a; 在使用vue框架element组件的背景下&#xff0c;我们对图片的展示需要点击放大(单张)&#xff1b;如果是多张图片&#xff0c;要支持左右滑动查看多张图片(多张)。 单张图片放大&#xff0c;el-image图片组件&#xff0c;或者原生的img标签。 多张图片放大&…

笛卡尔轨迹规划之齐次变换矩阵与欧拉角、四元数的转化

一、笛卡尔轨迹规划需求 笛卡尔轨迹规划本质就是我们对机械臂的末端位置和姿态进行规划&#xff0c;其实也就是对末端坐标系的位姿进行规划。我们清楚末端坐标系的位姿是可以用齐次变换矩阵T来表示的&#xff0c;但这样表示的话&#xff0c;并不利于我们去做规划&#xff0c;所…

NPU上如何使能pytorch图模式

1 Pytorch的compile技术 PyTorch 的 torch.compile 是一个强大的功能&#xff0c;用于优化 PyTorch 模型的性能。它通过将 PyTorch 的动态图转换为静态图&#xff0c;并利用 Just-In-Time&#xff08;JIT&#xff09;编译技术&#xff0c;显著提高模型的推理速度和训练效率。 …