这篇文章,我将以这题为例来展示AI刷题的优势。
问题描述
给你一个整数数组 nums 和一个整数 k,请你用一个字符串返回其中出现频率前 k 高的元素。请按升序排列。
时间复杂度必须优于 O(n log n),其中 n 是数组大小。
返回一个包含 k 个元素的字符串,数字元素之间用逗号分隔。数字元素按升序排列,表示出现频率最高的 k 个元素。
我们先自己来分析一下这道题
(1)我们首先需要统计每个元素在数组 nums 中出现的频率。可以使用哈希表来实现,元素作为键,频率作为值。
(2)维护前 k 个高频元素,可以使用一个小顶堆(优先队列)来维护频率最高的前 k 个元素。每次新元素加入时,如果堆的大小超过 k,则移除堆顶元素(即频率最小的元素)。堆的复杂度是 O(log k)。
(3)在获取到前 k 个高频元素后,我们需要对这些元素进行排序。由于 k 是远小于 n 的,因此直接排序的时间复杂度可以认为是 O(k log k)。
(4)将排序后的元素转换为字符串,按升序排列,元素之间用逗号分隔。
我们使用MarsCode AI来分析一下这个题目
询问Marscode AI
可以看到豆包MarsCode AI的思路挺清晰,带领我们开始读题,将左侧的题目完整的输出了出来
接着上面的回答,豆包MarsCode AI分析了解题思路,清晰地写出每一步会用到什么数据结构,并且它也考虑到了题目中限制时间复杂度
豆包MarsCode AI将步骤也一并给了出来
可以发现与我们自己分析的步骤几乎相同
我们也可以让豆包MarsCode AI给出一个代码的示例,在我使用的过程中,我发现豆包MarsCode AI可以读取你写的代码,当你没有写任何代码时,它会按照之前分析的解题思路来做题
但是当你已经写了代码,豆包MarsCode AI将会读取你已经写了的代码,对你的代码提出修改建议,并按照之前分析的思路,给我们一点提示,并给出修改后的代码示例。
这对于做题时遇到错误的朋友们太友好了,在我们做题没有头绪时,豆包MarsCode AI直接将我们的思路继续下去,同时,在给我们的代码中也有详细的注释,可以让我们更加清楚修改了什么。
我们尝试运行下豆包MarsCode AI给出的代码
代码正确。
我们在写完代码之后,我们还可以让豆包MarsCode AI将C++代码转为其他语言的代码
部分代码:
使用哈希表统计每个元素的频率
Map<Integer, Integer> freqMap = new HashMap<>();
for (int num : nums) {
freqMap.put(num, freqMap.getOrDefault(num, 0) + 1);
}
使用最小堆维护频率最高的 k 个元素
PriorityQueue<Map.Entry<Integer, Integer>> minHeap = new PriorityQueue<>(
(a, b) -> a.getValue() - b.getValue()
);
for (Map.Entry<Integer, Integer> entry : freqMap.entrySet()) {
minHeap.offer(entry);
if (minHeap.size() > k) {
minHeap.poll();
}
}
从堆中取出 k 个元素,按升序排列
List<Integer> topKFrequent = new ArrayList<>();
while (!minHeap.isEmpty()) {
topKFrequent.add(minHeap.poll().getKey());
}
Collections.sort(topKFrequent);
因为判题系统暂时只支持Java与python语言,转换无疑方便了我们的提交,提交下,我们成功通过了本题。
总结下
我们使用豆包MarsCode AI 来刷算法题可以大大提升我们的学习效率提高学习效果。
在上面例题的实践,我们可以看到豆包MarsCode AI 不仅能提供即时的反馈、个性化学习和高质量解析,还能帮助我们快速掌握解决算法问题的思路、方法和技巧
同时,使用豆包MarsCode AI来进行语言的互相转换,也可以方便我们的做题,不用拘泥于语言的限制,将重点回归到思路上。
接下来我还会继续使用豆包MarsCode AI来辅助我的学习。