每日两道力扣,day6

每日两道力扣,day6

每日两道力扣,day6

每日两道力扣,day6

在这里插入图片描述

每日两道力扣,今天是:

11. 盛最多水的容器 - 力扣(LeetCode)

15. 三数之和 - 力扣(LeetCode)

第一题:盛最多水的容器

11. 盛最多水的容器 - 力扣(LeetCode)

在这里插入图片描述
1.思路:

在写这个题之前,咱们需要了解一个经典原理——木桶效应。

在这里插入图片描述

显然,在相同底面积的情况下,木桶盛水的最大值,由最短的那块板决定。这个题很明显是双指针算法的应用场景。因为这个题目给出的是一个平面切割图,咱们定义left,right左右两个指针。底面积S = right - left。高度应是min(height[left],height[right]),所以体积v就是这二者的乘积。观察题目给的示例图,当height[left] < height[right] 时,left应该往右移动。反之,right应该往左移动。因为数组有限,我们只需要保证程序不会运行超时即可,剩下的交给计算机的算力。

2.代码实现:
class Solution { public: int maxArea(vector<int>& height) { int left = 0, right = height.size() - 1; int ret = 0; while(left < right) { int v = min(height[left], height[right]) * (right - left); ret = max(v,ret); if(height[left] < height[right]) left++; else right--; } return ret; } }; 
3.细节:

这个题需要理解木桶效应,以及示例图。较为简单,类似小学课本上的看图说话。

第二题:三数之和

15.三数之和-力扣leetcode

在这里插入图片描述
在这里插入图片描述
1.思路:

在写这道题的时候,我不知道大家有没有写过两数之和。有句话是这么说的:有人相爱,有人夜里看海,有人leetcode第一题要用两个for循环。小编就属于for循环大军里的一员,不过那个题我其实还会两种解法,排序+双指针,哈希(这个是看题解才知道的,我那会还没学到哈希呢)。

同样的这道三数之和,咱们也可以运用三个for循环暴力求解,但是我感觉99.99%会超时。3个for循环,时间复杂度是O(N3),你小子要是在面试的时候敢这样写,面试官分分钟让你进人才管理库。

还记得咱们昨天讲的双指针算法具有降维的特点吗?暴力法要用3个for循环,时间复杂度是O(N3),我们直接降为O(N2)。优雅,太优雅了。

具体落实的话是:

第一步,利用sort将数组排序

第二步,双指针算法里面定义一个target = -nums[i]

第三步,将nums[left] 与nums[rifght]的和,同target比较大小,推进左右指针(然后得到一组解)

但是我按照这三步落实代码的时候,测试样例跑不满,说明我们的代码还是存在可以优化的地方。这个时候我们就得想一想,哪里是不够完美的,不够优雅的呢?

(1)是sort吗?当然不是啊,我们只是调了一个库函数sort帮我们将数组排序。

(2)那既然排好序了,所以大小关系肯定是nums[i] < nums[left] <nums[right]咯,而我们在双指针算法里面定义一个target = -nums[i],那当nums[i] > 0的时候,那必然是不存在解的,所以我们直接break就好了。

(3)在经历(2)的优化后,我们发现测试样例还是跑不满。会出现重复的多余答案。显然对于nums[i]而言,当i++后,nums[i]很可能和nusm[i-1]相等啊。这个逻辑bug刚好和咱们的实践吻合,因此咱们必须把这里给优化。在i++后,写一个while循环,当i < n && nums[i] == nums[i-1],在防止数组越界的前提下,让i往后走一步。

2.代码实现:
class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int>> ret; sort(nums.begin(),nums.end()); int n = nums.size(); for(int i = 0; i < n; ) { int target = -nums[i]; int left = i+1; int right = n - 1; while(left < right) { //因为已经排完序了 //优化1 if(nums[i] > 0) break; if(nums[left] + nums[right] > target) { right--; } else if(nums[left] + nums[right] < target) { left++; } else { ret.push_back({nums[i],nums[left],nums[right]}); left++; right--; //跑不满啊,不要忘记我们是已经排好序了的 //所以我又来优化了 //优化2. while(left < right && nums[left] == nums[left-1]) left++; while(left < right && nums[right] == nums[right+1]) right--; } } //还是跑不满,不要忘记我们是已经排好序了的 //优化3. i++; while(i < n && nums[i] == nums[i-1]) i++; } return ret; } }; 
3.细节:

这个题的话不需要用到long long,但必须看懂思路里面的优化部分,不然就只能进人才管理库了。

先打个预防针,咱们明天要更新的是四数之和,接雨水。估计会很难,各位请做好心理准备。

好了,今天的每日两道力扣到这里就算是结束了,看完是不是感觉有所收获呢?如果学有所获的话,麻烦给个三连支持一下呗。感谢观看,您的支持,将是我前进路上的重要动力。

Read more

Spring AI宣布支持Agent Skills,Java开发者的福音

Spring AI宣布支持Agent Skills,Java开发者的福音

Agent Skills是一种模块化能力,以包含YAML前置元数据的Markdown文件形式打包。每个技能都是一个文件夹,其中包含一个SKILL.md文件,该文件包含元数据(至少包括名称和描述)以及指导AI Agent如何执行特定任务的说明。 Agent Skills(AI Agent技能)正在成为构建智能应用的新范式。它将AI能力模块化为可发现、可加载的资源包,让开发者不再需要为每个任务硬编码知识或创建专用工具。 Spring A正式I将这一设计模式引入Java生态系统,并实现了跨LLM的可移植性——你只需定义一次技能,就能在OpenAI、Anthropic、Google Gemini等任何支持的模型上使用。 这是Spring AI Agentic Patterns系列的第一篇文章。本系列将深入探讨spring-ai-agent-utils工具包,一套受Claude Code启发的完整Agent模式集合。 我们将依次介绍Agent Skills(本文)、任务管理、AskUserQuestion交互式工作流,以及用于复杂多Agent系统的分层子Agent。 什么是Agent

从「AI改变世界」到「AI帮我改Bug」:一个小厂架构师的Agent落地实战

从「AI改变世界」到「AI帮我改Bug」:一个小厂架构师的Agent落地实战

凌晨两点的顿悟:AI不是魔法,是工具 上周三凌晨两点,我坐在书房里揉着发涨的太阳穴——创业团队的产品刚上2.0版本,客户反馈的Bug堆了满满一屏幕。女儿的乐高积木还散在客厅地板上,老父亲的呼噜声从隔壁房间传来,而我面前的电脑屏幕上,一个红色的错误提示正在闪烁。 「要是有个AI能帮我自动定位Bug就好了。」我对着空气吐槽,顺手又灌了一口冰咖啡。 三个月前,我也是这么想的。那时候AI Agent的概念正火,我在各种技术大会上听了无数次「Agent将颠覆软件开发」的演讲。回到公司后,我拍着胸脯跟团队说:「咱们也搞个AI Agent,让它帮我们写代码、测Bug、甚至做需求分析!」 现在想来,当时的自己简直像个刚毕业的愣头青——热情有余,务实不足。 从「大而全」到「小而美」:我的Agent落地三步走 落地流程可视化 遇到问题 遇到问题 遇到问题 接入错误日志系统 懂代码库结构 全能Agent幻想 系统启动慢 代码质量差 功能臆想 反思与调整 找到最小可用场景

《算法题讲解指南:优选算法-栈》--65.删除字符中的所有相邻重复项,66.比较含退格的字符串,67.基本计算器II,68.字符串解码,69.验证栈序列

《算法题讲解指南:优选算法-栈》--65.删除字符中的所有相邻重复项,66.比较含退格的字符串,67.基本计算器II,68.字符串解码,69.验证栈序列

🔥小叶-duck:个人主页 ❄️个人专栏:《Data-Structure-Learning》《C++入门到进阶&自我学习过程记录》 《算法题讲解指南》--优选算法 《算法题讲解指南》--递归、搜索与回溯算法 《算法题讲解指南》--动态规划算法 ✨未择之路,不须回头 已择之路,纵是荆棘遍野,亦作花海遨游 目录 65.删除字符中的所有相邻重复项 题目链接: 题目描述: 题目示例: 解法(栈): 算法思路: C++算法代码: 算法总结及流程解析: 66.比较含退格的字符串 题目链接: 题目描述: 题目示例: 解法(用数组模拟栈): 算法思路: C++算法代码: 算法总结及流程解析: 67.基本计算器II 题目链接:  题目描述: 题目示例: 解法(栈)

SpringAI 大模型应用开发篇-SpringAI 项目的新手入门知识

SpringAI 大模型应用开发篇-SpringAI 项目的新手入门知识

🔥博客主页: 【小扳_-ZEEKLOG博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录         1.0 SpringAI 概述         1.1 大模型的使用         2.0 SpringAI 新手入门         2.1 配置 pom.xml 文件         2.2 配置 application.yaml 文件         2.3 配置 ChatClient         2.4 同步调用         2.5 流式调用         2.6 System 设定         2.7 日志功能         2.8 会话记忆功能