从工程视角拆解 LLM、Token、Context、RAG、Prompt、Tool、MCP、Agent 与 Agent Skill 这九个核心 AI 概念。
推导 Bloom Filter 的误判率公式,并给出最优哈希函数个数与位数组长度的数学结论。
通过一个最小示例介绍如何使用 LLVM libFuzzer 构建模糊测试,并定位程序中的崩溃问题。
题目描述
给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。 你可以认为每种硬币的数量是无限的。
题解
- 定义状态:
$dp[i]$表示用所给的面值的硬币凑成金额$i$所需的最少的硬币个数。
- 设计状态转移方程:
$$ \forall coin \in coins, 当 i \geqslant coin,且 dp[i - coin] \neq -1 时, dp[i] = std::min(dp[i], dp[i - coin] + 1) $$
- 初始化:
对于 amount...
题目描述
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
题解
这道题是一个非常典型而且很简单的动态规划题目。我们可以根据动态规划题目解题的一般思路来分析:
- 定义状态:
$dp[i]$表示爬到第$i$级楼梯的不同方法数。由于每次可以选择爬 $1$ 级或者 $2$ 级楼梯, 所以爬到第 $i$ 级楼梯的方法数等于爬到第 $i-1$ 级楼梯和第 $i-2$ 级楼梯的方法数之和。 根据这个关系,我们可以使用动态规划的方式从 $1$ 级楼梯开始逐步计算到第 $n$ 级楼梯的方法数,最终返回 $dp[n]$即为结果。
- 设计状态转移方程:
$$dp[i] =...
题目描述
给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
题解
由题可知,数组nums非空,所以分割后的两个子集也必然非空,由于都是正整数,所以nums中元素之和必然为偶数。
这道题是典型的 01 背包问题,假设$dp[i][j]$表示nums中前$i$个元素是否包含和为$j$的子集,那么:
- 当
nums[i] = j的时候,dp[i][j] = true - 当
nums[i] > j的时候,dp[i][j] = dp[i - 1][j] - 当
nums[i] < j的时候,dp[i][j] = dp[i - 1][j] || dp[i -...
题目描述
设计一个支持
push,pop,top操作,并能在常数时间内检索到最小元素的栈。 实现MinStack类:MinStack()初始化void push(int val)将元素推入堆栈void pop()删除堆栈顶部的元素int pop()获取堆栈顶部的元素int getMin()获取堆栈中的最小元素
题解:
这道题首先要满足堆栈的特性 LIFO,其次是能够在常数时间内获取当前栈中最小的元素,因此我们可以用堆栈保存 个二元组,二元组的第一个元素是存入栈中的值,第二个元素是当前元素作为栈顶元素的时候,栈中的最小值。有 了这个思路,代码实现起来就很简单了。
1class MinStack...题目描述
给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。 如果链表中存在环 ,则返回 true 。 否则,返回 false 。
解法一:hash 法
hash 法是我们在判断重复元素类问题中最常用的方法。针对链表是否有环来说,我们可以遍历链表,并用std::set
存放遍历过的元素,判断是否存在重复元素,如果存在则表示有环,如果遍历结束且不存在重复,则没有环。
