每日算法-250510

news2025/7/14 7:59:17

每日算法学习记录 - 250510

1. LeetCode 2086. 喂食仓鼠的最小食物桶数

题目描述:
题目图片

解题思路

这是一个典型的贪心问题。我们的目标是用最少的食物桶喂饱所有仓鼠。

解题过程

核心思想是:当遇到一只仓鼠时,如何放置食物桶才能最有效地利用这个桶。

  1. 遍历字符串 hamsters
  2. 当遇到一只仓鼠 s[i] == 'H' 时:
    • 优先考虑在其右侧(i+1)放置食物桶。 这样做是因为放在右边的食物桶 s[i+1] 不仅可以喂饱当前仓鼠 s[i],还有可能喂饱它右边的仓鼠 s[i+2](如果 s[i+2] 也是 ‘H’)。这使得一个桶的效益最大化。
    • 如果右侧 s[i+1] 是空地 '.':我们在此处放置一个桶,计数器 ret 加 1。由于 s[i+1] 上的桶可以喂饱 s[i] 和潜在的 s[i+2],我们可以跳过检查 s[i+1] (现在是桶) 和 s[i+2] (已被喂饱)。因此,我们将索引 i 向前移动 2 格(i += 2),加上循环自身的 i++,相当于下次从 i+3 开始检查。
    • 如果右侧不能放置(比如 i+1 越界,或者 s[i+1] 是另一只仓鼠 ‘H’),再考虑在其左侧(i-1)放置食物桶。
    • 如果左侧 s[i-1] 是空地 '.':我们在此处放置一个桶,计数器 ret 加 1。这个桶喂饱了 s[i]。索引 i 正常通过循环的 i++ 后移。
    • 如果左右两侧都无法放置食物桶:那么当前仓鼠 s[i] 无法被喂饱,根据题意返回 -1。
  3. 遍历完成后,返回 ret

复杂度分析

  • 时间复杂度: O ( N ) O(N) O(N), 其中 N N N 是字符串 hamsters 的长度。我们只需要遍历一次字符串。
  • 空间复杂度: O ( N ) O(N) O(N) O ( 1 ) O(1) O(1)

代码实现

class Solution {
    public int minimumBuckets(String hamsters) {
        int ret = 0;
        char[] s = hamsters.toCharArray();
        int n = s.length;
        for (int i = 0; i < n; i++) {
            if (s[i] == 'H') {
                char left = i > 0 ? s[i - 1] : 'H';
                char right = i < n - 1 ? s[i + 1] : 'H';
                if (right == '.') {
                    ret++;
                    i += 2;
                } else if (left == '.') {
                    ret++;
                } else {
                    return -1;
                }
            }
        }
        return ret;
    }
}

2. LeetCode 2571. 将整数减少到零需要的最少操作数

题目描述:
题目图片

解题思路

这个问题可以通过分析数字的二进制表示,并采用贪心策略来解决。目标是每次操作都尽可能有效地减少 n 或将其转化为更容易处理的形式(更接近2的幂)。

解题过程

我们将整数 n 视为其二进制表示。每次操作我们可以选择加上或减去一个2的幂。

  1. 获取最低位的 ‘1’:
    使用位运算 lowbit = n & (-n) 可以得到 n 的二进制表示中,最低位的那个 ‘1’ 以及它之后的所有 ‘0’ 组成的数。这个 lowbit 值本身就是一个2的幂,对应题目中可以操作的数。

  2. 贪心决策:
    对于当前的 n 和其 lowbit

    • 情况1: lowbit 的左边(更高一位)也是 ‘1’。
      例如,n = 6 (0110_2)lowbit = 2 (0010_2)。此时 lowbit 的左边是 ‘1’。
      这种情况通过 (n & (lowbit << 1)) > 0 来判断。
      我们选择 n = n + lowbit6 + 2 = 8 (1000_2)
      这样做的好处是,...011... 形式的位序列通过加法可以变成 ...100...,有效地将两个(或更多连续的)'1’s 通过进位合并,从而可能更快地减少 ‘1’ 的总数或简化数字结构。
    • 情况2: lowbit 的左边是 ‘0’。
      例如,n = 4 (0100_2)lowbit = 4 (0100_2)。或者 n = 10 (1010_2)lowbit = 2 (0010_2)
      这种情况是 (n & (lowbit << 1)) == 0
      我们选择 n = n - lowbit4 - 4 = 010 - 2 = 8 (1000_2)
      这样做直接消除了最低位的 ‘1’。
  3. 迭代与计数:
    每次操作后,操作数 ret 加 1。
    循环继续,直到 n 变为0。

  4. 特殊循环终止条件 (优化):
    n 变成一个2的幂时(即 (n & (n - 1)) == 0n > 0),我们知道只需要再进行一次操作(减去 n 本身)就可以将其变为0。
    代码中的循环条件 (n & (n - 1)) != 0 利用了这一点:当 n 成为2的幂或0时,循环终止。
    ret 初始化为 1。如果 n 初始就是2的幂,循环不进入,直接返回 1(一次操作)。如果 n 不是2的幂,进入循环,每执行一次 n += lowbitn -= lowbitret 增加。当循环结束时,n 必然是一个2的幂(因为 n 不会是0退出循环,除非一开始就是0,但题目约束 1 <= n <= 10^5)。此时的 ret 值已经包含了将这个最终的2的幂减到0的那次操作。

复杂度分析

  • 时间复杂度: O ( log ⁡ N ) O(\log N) O(logN)。在二进制表示下,每次操作要么消除一个 ‘1’,要么通过进位合并 ‘1’,总体上使问题规模减小。操作的次数与 N 的二进制位数大致成正比。
  • 空间复杂度: O ( 1 ) O(1) O(1)。我们只需要常数级别的额外空间。

代码实现

class Solution {
    public int minOperations(int n) {
        int ret = 1;
        while ((n & (n - 1)) != 0) {
            int lowbit = n & (-n);
            if ((n & (lowbit << 1)) > 0) {
                n += lowbit;
            } else {
                n -= lowbit;
            }
            ret++;
        }
        return ret;
    }
}

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

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

相关文章

渗透测试行业术语1

渗透测试行业术语1 1. 肉鸡 所谓“肉鸡”是一种很形象的比喻&#xff0c;比喻那些可以随意被我们控制的电脑&#xff0c;对方可以是 WINDOWS 系统&#xff0c;也可以是 UNIX/LINUX 系统可以是普通的个人电脑&#xff0c;也可以是大型的服务器我们可以象操作自己的电脑那样来操…

【大模型】使用 LLaMA-Factory 进行大模型微调:从入门到精通

使用 LLaMA-Factory 进行模型微调&#xff1a;从入门到精通 一、环境搭建&#xff1a;奠定微调基础&#xff08;一&#xff09;安装依赖工具&#xff08;二&#xff09;创建 conda 环境&#xff08;三&#xff09;克隆仓库并安装依赖 二、数据准备&#xff1a;微调的基石&#…

使用Python 打造多格式文件预览工具 — 图、PDF、Word、Excel 一站式查看

在日常办公或文件管理场景中&#xff0c;我们经常面临这样的问题&#xff1a;在一个文件夹中短时间内产生了大量不同类型的文件&#xff08;如图片、PDF、Word、Excel&#xff09;&#xff0c;我们需要快速浏览和筛选这些文件的内容&#xff0c;却不希望一个个打开它们。有没有…

[docker基础四]容器虚拟化基础之 LXC

目录 一 认识LXC 二 LXC容器操作实战 1&#xff09;实战目的 2&#xff09;基础知识 lxc-checkconfig lxc-create lxc-start lxc-ls lxc-info lxc-attach lxc-stop lxc-destory 3&#xff09;安装LXC(我的是Ubuntu) 4&#xff09;操作实战 1. 检查 lxc 是否运行…

路由策略和策略路由的区别以及配置案例

区别 路由策略&#xff1a;路由策略是通过ACL等方式控制路由发布&#xff0c;让对方学到适当路由条目&#xff0c;比如有20条路由&#xff0c;只想让某个路由器学到10条&#xff0c;可以通过路由策略进行过滤。 策略路由&#xff1a;策略路由是通过定义策略和应用&#xff0c…

MAD-TD: MODEL-AUGMENTED DATA STABILIZES HIGH UPDATE RATIO RL

ICLR 2025 spotlight paper 构建能够在少量样本下学习出优良策略的深度强化学习&#xff08;RL&#xff09;智能体一直是一个极具挑战性的任务。为了提高样本效率&#xff0c;近期的研究尝试在每获取一个新样本后执行大量的梯度更新。尽管这种高更新-数据比&#xff08;UTD&am…

PyTorch API 10 - benchmark、data、批处理、命名张量

基于 PyTorch 2.7 文章目录 基准测试工具 - torch.utils.benchmarktorch.utils.bottlenecktorch.utils.checkpointtorch.utils.cpp_extensiontorch.utils.data数据集类型映射式数据集可迭代式数据集 数据加载顺序与采样器加载批处理与非批处理数据自动批处理&#xff08;默认情…

后缀表达式+栈(详解)(c++)

前言 很抱歉&#xff0c;上一期没有介绍栈stack的用法&#xff0c;今天简要介绍一下&#xff0c;再讲讲后缀表达式&#xff0c;用stack栈做一些后缀表达式的练习。 栈 栈stack是c中系统给出的栈&#xff0c;有了它&#xff0c;就不用自己创建栈啦&#xff01; 头文件 栈sta…

[C++类和对象]构造函数和析构函数

类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f; 并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6 个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器会…

onenet连接微信小程序(mqtt协议)

一、关于mqtt协议 mqtt协议常用于物联网&#xff0c;是一种轻量级的消息推送协议。 其中有三个角色&#xff0c;Publisher设备&#xff08;客户端&#xff09;发布主题到服务器&#xff0c;其他的设备通过订阅主题&#xff0c;获取该主题下的消息&#xff0c;Publisher可以发…

人脸真假检测:SVM 与 ResNet18 的实战对比

在人工智能蓬勃发展的当下&#xff0c;人脸相关技术广泛应用于安防、金融、娱乐等诸多领域。然而&#xff0c;随着人脸合成技术的日益成熟&#xff0c;人脸真假检测成为保障这些应用安全的关键环节。本文将深入探讨基于支持向量机&#xff08;SVM&#xff09;结合局部二值模式&…

《AI大模型应知应会100篇》第54篇:国产大模型API对比与使用指南

第54篇&#xff1a;国产大模型API对比与使用指南 ——从百度文心到通义千问&#xff0c;一文看懂国内AI平台选型 &#x1f4cc; 摘要 随着中国人工智能产业的快速发展&#xff0c;越来越多的国产大模型平台开始崭露头角。本文将系统梳理当前主流国产大模型 API&#xff08;如…

质量、重力、引力、惯性 的本质,以及虫洞

1、质量 物体,之所以,有质量源自于其微观结构。物体好比一块海绵,浸没在暗物质的海洋里。随暗物质海洋的涌动而不断移动。海绵微观结构越细密,受到暗物质海洋的裹携力就越大(好比汤勺,与漏勺对汤水的阻碍力。又好比纱窗与船帆对风的阻隔力。) 微观结构越细密,在相同表面积…

基于ssm+mysql的快递管理系统(含LW+PPT+源码+系统演示视频+安装说明)

系统功能 管理员功能&#xff1a;个人中心、用户管理、订单管理、快递员管理&#xff1b;快递员功能&#xff1a;查看订单、更新快递状态&#xff1b;派单员功能&#xff1a;订单分配、订单管理&#xff1b;客户功能&#xff1a;订单查询、个人信息维护。 作者&#xff1a;计算…

质心均匀体(引力屏蔽技术)

1、线质心体 陀螺我们都玩过,一个惯性圆盘加一个轴,旋转起来可以独脚而立。(垂直于旋转面的不平衡力,在旋转面旋转180度后,被其自身抵消,故而平衡。可抵消不平衡力的大小,取决于惯性飞轮的质量和旋转的速度)。此时,旋转的陀螺等同于一个轴线质心体(轴线上任意一点提供支…

JAVA实战开源项目:健身房管理系统 (Vue+SpringBoot) 附源码

本文项目编号 T 180 &#xff0c;文末自助获取源码 \color{red}{T180&#xff0c;文末自助获取源码} T180&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

STM32的SysTick

SysTick介绍 定义&#xff1a;Systick&#xff0c;即滴答定时器&#xff0c;是内核中的一个特殊定时器&#xff0c;用于提供系统级的定时服务。该定时器是一个24位的递减计数器&#xff0c;具有自动重载值寄存器的功能。当计数器到达自动重载值时&#xff0c;它会自动重新加载…

【图书管理系统】深度讲解:图书列表展示的后端实现、高内聚低耦合的应用、前端代码讲解

1.约定前后端交互接口 [请求] /book/getListByPage [参数] currentPage1&pageSize10 [响应] 返回封装的result对象对应的Json数据 2. 整体逻辑 2.1 Controller的逻辑 &#xff08;1&#xff09;把接收的参数封装为PageRequest类&#xff0c;里面有属性&#xff1a;curren…

养生:为健康生活添彩

养生是对生活的热爱&#xff0c;是为健康生活注入活力的良方。从饮食、运动到生活习惯&#xff0c;每一个方面都能让我们离健康更近一步。以下是一些实用的养生之道&#xff0c;助你开启健康生活的新旅程。 饮食养生&#xff1a;营养均衡&#xff0c;健康基石 合理的饮食是养…

服务器综合实验(实战详解)

该文章的目录部分 实验内容 实验完成步骤 虚拟机准备 配置两个虚拟机的本地仓库 虚拟机A&#xff1a; 虚拟机B&#xff1a; 配置SSH公钥互信 虚拟机A&#xff1a; ​编辑 虚拟机B&#xff1a; 提供基于bind的DNS服务 虚拟机A&#xff1a; 项目需求1&#xff1a; …