lucifer

据知情人透露,DeepSeek 原计划在五月初发布 R2,现在希望尽早发布,但没有提供具体细节。

这一消息不仅让人对 R2 的性能充满期待,也折射出当前 AI 竞赛的激烈程度。

DeepSeek 作为一家快速崛起的 AI 研究公司,其上一代模型已在开源社区中崭露头角。而 R2 的提前发布计划,似乎暗示着外部竞争压力或内部技术突破的推动。

R2 可能带来的影响

尽管具体细节未明,但我们可以从 DeepSeek 的技术路线和行业趋势推测 R2 的潜在影响。

1. 性能提升

R2 可能会在自然语言处理、推理能力或多模态任务上有所突破。如果能以更低的计算成本实现媲美甚至超越闭源模型的表现(如 GPT-4),它将成为开源社区的一大福音。

2. 生态竞争

R2 的提前发布可能迫使其他公司调整计划。例如,xAI 的 Grok 3 或 Anthropic 的 Claude 3.7 若感受到威胁,可能会加快开发速度。这种连锁反应将进一步推动 AI 技术的整体进步。

3. 开源与商业的博弈

DeepSeek 的开源策略一直是其亮点,但提前发布是否会伴随商业化尝试(如提供 API 服务)尚不得而知。如果 R2 在保持开源的同时推出收费服务,可能会重塑开源模型的盈利模式。

究竟会有什么样的火花?我们拭目以待~

回归正题,我们来一道力扣中等题目 设计浏览器历史记录,也是 2025-02-26 的每日一题。

题目描述

你需要设计一个浏览器历史记录功能,类似于浏览器的前进和后退按钮。具体来说,你需要实现一个 BrowserHistory 类,支持以下操作:

  • BrowserHistory(string homepage):用主页 URL 初始化浏览器。
  • void visit(string url):从当前页面访问一个新的 URL。新 URL 会被添加到历史记录中,且后续的历史记录将被清除(即无法前进到之前的后续页面)。
  • string back(int steps):向后退 steps 步,返回当前页面 URL。如果后退步数超过历史记录起始点,则停留在主页。
  • string forward(int steps):向前走 steps 步,返回当前页面 URL。如果前进步数超过历史记录末尾,则停留在最后一个页面。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
输入:
["BrowserHistory","visit","visit","visit","back","back","forward","forward","visit","forward"]
[["leetcode.com"],["google.com"],["facebook.com"],["youtube.com"],[1],[1],[1],[2],["linkedin.com"],[2]]
输出:
[null,null,null,null,"facebook.com","google.com","facebook.com","youtube.com",null,"linkedin.com"]

解释:
BrowserHistory browserHistory = new BrowserHistory("leetcode.com"); // 初始化主页
browserHistory.visit("google.com"); // 访问 google.com
browserHistory.visit("facebook.com"); // 访问 facebook.com
browserHistory.visit("youtube.com"); // 访问 youtube.com
browserHistory.back(1); // 后退 1 步,返回 "facebook.com"
browserHistory.back(1); // 后退 1 步,返回 "google.com"
browserHistory.forward(1); // 前进 1 步,返回 "facebook.com"
browserHistory.forward(2); // 前进 2 步,停在 "youtube.com"(无更多后续)
browserHistory.visit("linkedin.com"); // 访问 linkedin.com,后续历史被清除
browserHistory.forward(2); // 前进 2 步,无后续历史,返回 "linkedin.com"

约束:

  • (1 \leq homepage.length \leq 20)
  • (1 \leq url.length \leq 20)
  • (1 \leq steps \leq 100)
  • 最多调用 (5000) 次 visitbackforward

思路

这道题本质上是一个双向线性历史记录管理问题,需要支持插入新记录、清理后续记录,以及在历史中前后移动。我们可以用一个数据结构来模拟浏览器的历史记录,同时追踪当前页面位置和有效记录的范围。

  1. 数据结构选择

    • 一个简单的数组(或列表)可以存储历史记录,记录按访问顺序排列。
    • 需要维护三个指针:
      • cur:当前页面索引。
      • start:历史记录的起点(通常是 0)。
      • end:历史记录的终点(最后一个有效页面的索引)。
  2. 操作实现

    • 初始化:将主页作为第一个页面,cur = 0end = 0
    • visit:追加新 URL 到数组,更新 curend,并清除后续历史(通过限制 end)。
    • back:将 cur 向左移动 steps 步,但不超过 start
    • forward:将 cur 向右移动 steps 步,但不超过 end
  3. 边界处理

    • 后退时不能超出主页(cur >= 0)。
    • 前进时不能超出末尾(cur <= end)。

步骤

使用一个列表存储历史记录,配合 curend 两个变量:

  • cur 表示当前页面索引。
  • end 表示最后一个有效页面的索引(新访问会覆盖后续记录)。
  • 通过简单的索引操作实现 backforward,并在 visit 时更新 end

代码实现

以下是 Python 3 的实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class BrowserHistory:
def __init__(self, homepage: str):
self.history = [homepage] # 存储历史记录的列表
self.cur = 0 # 当前页面索引
self.end = 0 # 最后一个有效页面的索引

def visit(self, url: str) -> None:
self.cur += 1 # 移动到新页面位置
# 如果插入位置超出当前列表长度,追加新 URL
if self.cur == len(self.history):
self.history.append(url)
else:
self.history[self.cur:] = [] # 清除后续历史
self.history.append(url)
self.end = self.cur # 更新末尾指针

def back(self, steps: int) -> str:
self.cur = max(0, self.cur - steps) # 后退 steps 步,但不低于 0
return self.history[self.cur]

def forward(self, steps: int) -> str:
self.cur = min(self.end, self.cur + steps) # 前进 steps 步,但不超过 end
return self.history[self.cur]

复杂度分析

  • 时间复杂度

    • __init__:(O(1)),初始化只需存储一个字符串。
    • visit:(O(n))(最坏情况),当需要清除后续历史时,列表切片操作可能涉及 (n) 个元素((n) 是当前历史长度)。但通常操作数较少,均摊接近 (O(1))。
    • back:(O(1)),仅更新索引。
    • forward:(O(1)),仅更新索引。
  • 空间复杂度

    • (O(n)),其中 (n) 是历史记录的总数,受限于调用 visit 的次数(最多 5000)。

总结

这道题考察了线性数据结构的设计与操作。通过一个简单的列表和两个指针(curend),我们可以高效实现浏览器的历史记录功能。代码简洁且直观,关键在于处理 visit 时的后续历史清除和边界条件。

如果你有其他解法(比如用双指针或栈),或者对某个操作的细节有疑问,欢迎讨论!

力扣专属折扣

力扣免费题目已经有了很多经典的了,也覆盖了所有的题型,只是很多公司的真题都是锁定的。个人觉得如果你准备找工作的时候,可以买一个会员。另外会员很多leetbook 也可以看,结合学习计划,效率还是蛮高的。

现在力扣在每日一题基础上还搞了一个 plus 会员挑战,每天刷题可以获得积分,积分可以兑换力扣周边。

如果你要买力扣会员的话,这里有我的专属力扣折扣:https://leetcode.cn/premium/?promoChannel=lucifer (年度会员多送两个月会员,季度会员多送两周会员)


 评论


博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议

本站使用 Material X 作为主题 。
载入天数...载入时分秒...