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

代码随想录算法训练营第二十七天

LeetCode.455 分发饼干

题目链接 分发饼干

题解

class Solution {public int findContentChildren(int[] g, int[] s) {int count = 0;Arrays.sort(g);Arrays.sort(s);for(int i = 0;i < s.length && count < g.length;i++){if(s[i] >= g[count]){count ++;}}return count;}
}

解题思路

这段代码实现了 "分发饼干" 问题的解决方案,其核心思路是使用贪心算法来最大化能够满足的孩子数量。

代码逻辑解析:

  1. 首先对孩子的胃口数组g和饼干尺寸数组s进行排序
  2. 然后使用双指针的思想:
    • count变量既表示已满足的孩子数量,也作为指向当前需要满足的孩子的指针
    • 遍历饼干数组s,对于每个饼干s[i]
    • 如果当前饼干能满足当前孩子的胃口(s[i] >= g[count]),则满足这个孩子(count++
    • 继续检查下一个饼干能否满足下一个孩子

这种解法的时间复杂度是 O (n log n + m log m),其中 n 和 m 分别是两个数组的长度,主要消耗在排序操作上。空间复杂度是 O (1) 或 O (log n + log m),取决于排序算法的实现。

该算法的贪心策略体现在:总是用最小的能满足孩子胃口的饼干去满足这个孩子,这样可以保留更大的饼干去满足可能有更大胃口的孩子,从而最大化满足的孩子总数。

LeetCode.376 摆动序列

题目链接 摆动序列

题解

class Solution {public int wiggleMaxLength(int[] nums) {if (nums.length <= 1) {return nums.length;}int preDiff = 0;int curDiff = 0;int count = 1;for(int i = 0;i<nums.length-1;i++){curDiff = nums[i+1] - nums[i];if((preDiff >= 0 && curDiff < 0) || (preDiff <= 0 && curDiff >0)){count ++;preDiff = curDiff;} }return count;}
}

解题思路

这段代码实现了求解 "摆动序列" 最长长度的功能,所谓摆动序列是指序列中相邻元素的差值正负交替出现。

代码逻辑解析:

  1. 边界处理:如果数组长度小于等于 1,直接返回数组长度(单个元素或空数组都是摆动序列)
  2. 定义两个变量:
    • preDiff:记录前一对元素的差值
    • curDiff:记录当前对元素的差值
    • count:记录摆动序列的长度,初始值为 1(至少有一个元素)
  3. 遍历数组,计算当前差值curDiff
  4. 核心判断:如果当前差值与前一个差值符号相反(一正一负或一负一正),说明形成了摆动
    • 此时增加计数count++
    • 并更新preDiff为当前差值
  5. 最后返回最长摆动序列的长度

这种解法的时间复杂度是 O (n),只需要遍历一次数组;空间复杂度是 O (1),只使用了几个额外变量。

算法的巧妙之处在于通过记录前后差值的符号变化来判断是否形成摆动,不需要额外存储整个序列,高效地完成了计算。

LeetCode.53 最大子序和

题目链接 最大子序和

题解

class Solution {public int maxSubArray(int[] nums) {int res = nums[0];int sum = 0;for(int i = 0;i<nums.length;i++){sum += nums[i];res = Math.max(sum,res);if(sum < 0) {sum = 0;}}return res;}
}

解题思路

这段代码实现了求解 "最大子数组和" 问题的解决方案,采用的是经典的贪心算法思路(也可以理解为 Kadane 算法的简化版本)。

代码逻辑解析:

  1. 初始化res为数组的第一个元素,用于保存最大子数组和的结果
  2. 初始化sum为 0,用于累积当前子数组的和
  3. 遍历数组中的每个元素:
    • 将当前元素加入到sum
    • 比较sumres,更新res为两者中的较大值
    • 如果sum小于 0,说明继续累积当前子数组会导致和变小,因此重置sum为 0,从下一个元素开始重新累积

这种解法的时间复杂度是 O (n),只需要遍历一次数组;空间复杂度是 O (1),只使用了常数个额外变量。

算法的贪心策略体现在:当累积和为负数时,果断放弃当前子数组,重新开始计算,因为负数只会拉低后续子数组的和。这种策略确保了我们总能找到和最大的连续子数组。

例如,对于数组[-2,1,-3,4,-1,2,1,-5,4],该算法会正确找到最大子数组[4,-1,2,1],其和为 6。

http://www.dtcms.com/a/290207.html

相关文章:

  • LLMs之Grok系列:Grok-4的简介、安装和使用方法、案例应用之详细攻略
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现打架检测(C#代码,UI界面版)
  • Go-通俗易懂垃圾回收及运行过程
  • 每日面试题11:JVM
  • Ubuntu 22.04 安装 Jdk 8和 Tomcat (安装包形式)
  • Three.js 从零入门:构建你的第一个 Web 3D 世界
  • 破除扫描边界Photoneo MotionCam-3D Color 解锁动态世界新维度
  • 计算机网络第四章(3)——网络层《IPV4(子网划分、子网掩码)》
  • datasophon下dolphinscheduler执行脚本出错
  • 突破密度瓶颈:PCIe 8xCAN 多通道接口技术解析
  • react 录音功能
  • ODB安装与使用
  • 部署zabbix企业级分布式监控
  • 智慧场景:定制开发开源AI智能名片S2B2C商城小程序赋能零售新体验
  • SLAM实战——13章代码学习及回环检测的补充
  • STM32-第九节-ADC模数转换
  • ❗量化模型构建回测框架
  • 【2025/07/21】GitHub 今日热门项目
  • 【HTTP缓存机制深度解析:从ETag到实践策略】
  • C# Lambdab表达式 Var 类
  • 如何防止QQ浏览器录屏,盗录视频资源?
  • Apache Ignite Binary Object 调优
  • 【牛客算法】小美的排列询问
  • Linux 命令大全
  • Java基础教程(010):面向对象中的this和就近原则
  • 移星科技 modbus-tcp 转 modbus-Rtu模块
  • 安卓模拟器安装后,sdk版本详情简介及安卓sdk建议装哪几个版本
  • 突破量子仿真瓶颈:微算法科技MLGO量子算法的算术化与核操作迭代模型
  • 区块链之以太坊合约开发工具——Metamask钱包和Remix IDE
  • Android MTK平台预置多张静态壁纸