136. 只出现一次的数字——single-number给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
示例 1 :
输入:nums = [2,2,1]
输出:1
示例 2 :
输入:nums = [4,1,2,1,2]
输出:4
示例 3 :
输入:nums = [1]
输出:1
提示:
1 <= nums.length <= 3 * 104
-3 * 104 <= nums[i] <= 3 * 104
除了某个元素只出现一次以外,其余每个元素均出现两次。
我的错误解法12345678910111213141516class Solution { public int singleNumber(int[] nums) { int[] result = new int[100000]; for (int i = 0; i < nums.length ...
121. 买卖股票的最佳时机——best-time-to-buy-and-sell-stock给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
示例 1:
1234输入:[7,1,5,3,6,4]输出:5解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
示例 2:
123输入:prices = [7,6,4,3,1]输出:0解释:在这种情况下, 没有交易完成, 所以最大利润为 0。
提示:
1 <= prices.length <= 105
0 <= prices[i] <= 104
方法:一次遍历算法
假设给定的数组为:[ ...
一、项目过程概述基于 FastGPT 构建物流数据智能问答系统,核心流程包含两大模块:
知识库搜索(①)
数据来源:本地 CSV 文件手动上传至 FastGPT,作为知识库基础数据。
处理逻辑:通过调用外部索引模型(嵌入模型),将 CSV 中的物流数据转化为向量索引,支持用户查询时的语义相似性检索(RAG 机制)。
预测模型调用(②)
模型基础:基于历史物流数据训练的预测模型(外部语言模型或定制模型)。
响应逻辑:结合知识库搜索结果(①的输出),调用该预测模型生成用户问答的最终响应。
二、当前存在的核心问题
知识库数据更新效率低
新物流数据需手动导入 CSV 文件至 FastGPT,无法实现自动化 / 批量更新,时效性差,且频繁手动操作易出错。
预测模型适应性不足
预测模型基于历史数据训练,当新增物流数据(尤其是分布或特征变化较大的数据)加入时,需重新训练模型才能适配新数据,导致模型维护成本高、迭代周期长,难以快速响应数据动态变化。
三、指导老师提问1.这个查询这个地方,它是直接用RAG来查询的吗?解答:
在 FastGPT 中,我选择了索引模型、语言模型并上传 ...
二叉树的最大深度——maximum-depth-of-binary-tree给定一个二叉树 root ,返回其最大深度。
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
示例 1:
12输入:root = [3,9,20,null,null,15,7]输出:3
示例 2:
12输入:root = [1,null,2]输出:2
提示:
树中节点的数量在 [0, 104] 区间内。
-100 <= Node.val <= 100
给我的第一看法是这个题给我的输入是层次遍历来的,如果要按我之前写c++的思路来就是先写一个确定二叉树的函数,然后再递归求出最大深度
后来发现是root已经是给好的二叉树,直接写最大深度的函数就行
法一:深度优先搜索DFS思路与算法
如果我们知道了左子树和右子树的最大深度 l 和 r,那么该二叉树的最大深度即为
max(l,r)+1
而左子树和右子树的最大深度又可以以同样的方式进行计算。因此我们可以用「深度优先搜索」的方法来计算二叉树的最大深度。具体而言,在计算当前二叉树的最大深度时,可以先递归计算出其左子树和右 ...
101. 对称二叉树——symmetric-tree给你一个二叉树的根节点 root , 检查它是否轴对称。
示例 1:
12输入:root = [1,2,2,3,4,4,3]输出:true
示例 2:
12输入:root = [1,2,2,null,3,null,3]输出:false
提示:
树中节点数目在范围 [1, 1000] 内
-100 <= Node.val <= 100
法一:递归思路和算法
如果一个树的左子树与右子树镜像对称,那么这个树是对称的。
因此,该问题可以转化为:两个树在什么情况下互为镜像?
如果同时满足下面的条件,两个树互为镜像:
它们的两个根结点具有相同的值
每个树的右子树都与另一个树的左子树镜像对称
我们可以实现这样一个递归函数,通过「同步移动」两个指针的方法来遍历这棵树,p 指针和 q 指针一开始都指向这棵树的根,随后 p 右移时,q 左移,p 左移时,q 右移。每次检查当前 p 和 q 节点的值是否相等,如果相等再判断左右子树是否对称。
代码如下。
123456789101112131415class Solution ...
94. 二叉树的中序遍历——binary-tree-inorder-traversal给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。
示例 1:
12输入:root = [1,null,2,3]输出:[1,3,2]
示例 2:
12输入:root = []输出:[]
示例 3:
12输入:root = [1]输出:[1]
提示:
树中节点数目在范围 [0, 100] 内
-100 <= Node.val <= 100
我发现这题肯定要用递归,但是题目条件给的函数的返回值是List,但是递归到空结点直接退出,所以要写另一个函数
法一:递归思路与算法
首先我们需要了解什么是二叉树的中序遍历:按照访问左子树——根节点——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候我们按照同样的方式遍历,直到遍历完整棵树。因此整个遍历过程天然具有递归的性质,我们可以直接用递归函数来模拟这一过程。
定义 inorder(root) 表示当前遍历到 root 节点的答案,那么按照定义,我们只要递归调用 inorder(root.left) 来遍历 root ...
70. 爬楼梯——climbing-stairs假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例 1:
12345输入:n = 2输出:2解释:有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶
示例 2:
123456输入:n = 3输出:3解释:有三种方法可以爬到楼顶。1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶
提示:
1 <= n <= 45
第一反应就是一个一个去数,先算全是1的,再算有一个2阶的,直到最后
看答案发现可以用动态规划或者其他方法写
法一:动态规划思路和算法
我们用 f(x) 表示爬到第 x 级台阶的方案数,考虑最后一步可能跨了一级台阶,也可能跨了两级台阶,所以我们可以列出如下式子:
f(x)=f(x−1)+f(x−2)
它意味着爬到第 x 级台阶的方案数是爬到第 x−1 级台阶的方案数和爬到第 x−2 级台阶的方案数的和。很好理解,因为每次只能爬 1 级或 2 级,所以 f(x) 只能从 f(x−1) 和 f( ...
21. 合并两个有序链表——merge-two-sorted-lists将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
12输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]
示例 2:
12输入:l1 = [], l2 = []输出:[]
示例 3:
12输入:l1 = [], l2 = [0]输出:[0]
提示:
两个链表的节点数目范围是 [0, 50]
-100 <= Node.val <= 100
l1 和 l2 均按 非递减顺序 排列
这题之前用c++写的,写了好像有一百多行(类似后面的法二)
思路是:用双指针,分别指向两个待合并的链表,只要两个表不空,就依次比较两个指针指向结点的值,把小的放入新的链表里面,如果有一个链表空了,就把另一个剩余的接到新链表
决定直接看答案,学习新方法,发现新方法真简单:
法一:递归
法二:迭代
法一:递归思路
我们可以如下递归地定义两个链表里的 merge 操作(忽略边界情况,比如空链表等):
12li ...
20. 有效的括号——valid-parentheses给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例 1:
12输入:s = "()"输出:true
示例 2:
12输入:s = "()[]{}"输出:true
示例 3:
12输入:s = "(]"输出:false
示例 4:
12输入:s = "([])"输出:true
示例 5:
12输入:s = "([)]"输出:false
提示:
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
法一:栈(我的正确答案)1 ...
1. 两数之和——two-sum给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
示例 1:
123输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
12输入:nums = [3,2,4], target = 6输出:[1,2]
示例 3:
12输入:nums = [3,3], target = 6输出:[0,1]
提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案
进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?
法一:暴力枚举(我的答案)思路及算法
最容易想到的方法是枚举数组中的每一个数 x,寻 ...


