LeetCode 竞赛题解:掌握算法技巧,提升编程能力

聖光之護
发布: 2025-12-18 10:56:02
原创
149人浏览过
算法是编程的灵魂,而 LeetCode 竞赛则是检验和提升算法能力的绝佳平台。本文将深入剖析近期 LeetCode 竞赛中的经典题目,详细讲解解题思路、关键技巧和代码实现,助力各位编程爱好者在算法的道路上更进一步。通过学习这些题解,你不仅可以掌握解决特定问题的技能,更能提升解决各种编程问题的整体能力,为未来的职业发展打下坚实的基础。

关键要点

Sum of Digits in Base K: 理解进制转换,掌握基本数学运算。

Frequency of the Most Frequent Element: 运用排序和滑动窗口思想,优化算法效率。

Longest Substring of All Vowels in Order: 掌握字符串处理技巧,理清逻辑顺序。

LeetCode 竞赛题解:算法思路与代码实现

问题一:Sum of Digits in Base K (K 进制数字之和)

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

leetcode 竞赛题解:掌握算法技巧,提升编程能力

题目要求我们将一个十进制整数转换为 K 进制,然后计算 K 进制下各位数字之和。这个问题的核心在于理解进制转换的原理以及如何将十进制数转换为任意进制。 我们可以采用短除法进行进制转换,每次将原数除以 K,得到的余数即为 K 进制下的一位数字,商则作为新的原数继续进行短除,直到商为 0 为止。最后,将所有余数(即 K 进制下的各位数字)相加即可得到答案。

算法思路:

  1. 初始化一个变量 ans 用于存储 K 进制数字之和,初始值为 0。
  2. 使用循环将十进制数 n 转换为 K 进制:
    • 在循环中,每次计算 n % K,并将结果加到 ans 中。
    • 更新 n 的值为 n / K
    • 如果 n 小于 K,将 n 加到 ans 中并结束循环。
  3. 返回 ans,即 K 进制数字之和。

代码示例 (C++):

百度文心百中
百度文心百中

百度大模型语义搜索体验中心

百度文心百中 263
查看详情 百度文心百中
class Solution {
public:
    int sumBase(int n, int k) {
        int ans = 0;
        while (n >= k) {
            ans += n % k;
            n /= k;
        }
        ans += n;
        return ans;
    }
};
登录后复制

这段代码简洁高效地完成了进制转换和求和的过程。通过这个题目,我们巩固了进制转换的基础知识,并学会了利用循环结构解决数学问题。

问题二:Frequency of the Most Frequent Element (最频繁元素的频率)

LeetCode 竞赛题解:掌握算法技巧,提升编程能力

该问题要求在给定数组 nums 中,我们可以执行最多 k 次操作,每次操作可以选择一个元素并将其值加 1。目标是返回数组中出现次数最多的元素在经过操作后可能达到的最大频率。解决此问题的关键在于找到一个合适的策略,通过增加某些元素的值,使得它们与其他元素相等,从而增加该元素的频率。

算法思路:

  1. 首先对数组 nums 进行排序,这是为了方便我们使用滑动窗口的思想。排序后的数组可以更容易地找到连续的区间,这些区间内的元素可以通过增加操作变为相同的值。
  2. 使用滑动窗口 [left, right],维护一个窗口内的元素,使得窗口内的所有元素可以通过最多 k 次操作变为窗口内的最大值 nums[right]
  3. 在每次迭代中,我们计算将窗口内所有元素变为 nums[right] 所需的操作次数:cost = nums[right] * (right - left + 1) - sum,其中 sum 是窗口内所有元素的和。
  4. 如果 cost 大于 k,则说明窗口太大,无法通过 k 次操作将所有元素变为相同值。此时,我们需要收缩窗口,即增加 left 的值,直到 cost 小于等于 k
  5. 维护一个变量 maxFrequency 用于记录最大频率,每次更新窗口时,更新 maxFrequency = max(maxFrequency, right - left + 1)
  6. 最终返回 maxFrequency

代码示例 (C++):

class Solution {
public:
    int maxFrequency(vector<int>& nums, int k) {
        sort(nums.begin(), nums.end());
        int left = 0;
        long long sum = 0;
        int maxFrequency = 0;
        for (int right = 0; right < nums.size(); right++) {
            sum += nums[right];
            while ((long long)nums[right] * (right - left + 1) - sum > k) {
                sum -= nums[left];
                left++;
            }
            maxFrequency = max(maxFrequency, right - left + 1);
        }
        return maxFrequency;
    }
};
登录后复制

表格总结:

步骤 描述
1 对数组进行排序
2 使用滑动窗口维护区间
3 计算操作成本
4 收缩窗口,直到成本小于等于 k
5 更新最大频率
6 返回最大频率

通过这个题目,我们学习了如何利用排序和滑动窗口优化算法,以及如何在限定操作次数的情况下最大化某个目标值。

问题三:Longest Substring Of All Vowels in Order (按顺序包含所有元音的最长子字符串)

LeetCode 竞赛题解:掌握算法技巧,提升编程能力

此题的挑战在于寻找满足特定条件的最长子字符串。该条件要求子字符串必须包含所有元音字母('a'、'e'、'i'、'o'、'u'),且这些元音字母必须按照字母顺序排列。这意味着子字符串必须以 'a' 开头,然后是若干个 'a',接着是若干个 'e',以此类推,直到 'u' 结束。

算法思路:

  1. 遍历字符串,将连续出现的相同元音字母进行合并,并记录每个元音字母的数量。例如,对于字符串 "aaaeiiiouu", 合并后的结果为 [{'a', 3}, {'e', 3}, {'i', 2}, {'o', 1}, {'u', 2}]
  2. 判断合并后的数组长度是否等于 5,因为只有包含所有元音字母的字符串才有可能满足条件。如果长度小于 5,则直接返回 0。
  3. 检查合并后的数组是否满足元音字母的顺序排列。如果满足,则计算字符串的长度并返回;否则,返回 0。

代码示例 (C++):

class Solution {
public:
    int longestBeautifulSubstring(string word) {
        vector<pair<char, int>> a;
        char c = word[0];
        int len = 1;
        for (int i = 1; i < word.size(); i++) {
            if (word[i] == word[i - 1]) {
                len++;
            } else {
                a.push_back({word[i - 1], len});
                c = word[i];
                len = 1;
            }
        }
        a.push_back({word[word.size() - 1], len});

        if (a.size() < 5) return 0;

        int maxi = 0;
        for (int i = 0; i <= a.size() - 5; i++) {
            if (a[i].first == 'a' && a[i + 1].first == 'e' && a[i + 2].first == 'i' && a[i + 3].first == 'o' && a[i + 4].first == 'u') {
                maxi = max(maxi, a[i].second + a[i + 1].second + a[i + 2].second + a[i + 3].second + a[i + 4].second);
            }
        }
        return maxi;
    }
};
登录后复制

通过此题,我们学习了如何处理字符串中的连续字符,并结合顺序约束条件进行求解。

LeetCode高效学习技巧

总结与实战

在LeetCode上进行算法学习与练习,总结和实战是至关重要的两个环节。将学习的知识系统化、条理化,同时通过实际应用来巩固和加深理解。

  1. 代码模板: 针对特定类型的题目,可以创建代码模板,例如二分查找、滑动窗口、动态规划等。这些模板可以帮助你快速解决类似问题,提高解题速度。

    LeetCode 竞赛题解:掌握算法技巧,提升编程能力

  2. 题目分类: LeetCode上的题目种类繁多,但可以通过分类来更有针对性地学习。常见的分类包括:数组、链表、树、图、哈希表、动态规划、贪心算法等。针对每个分类,可以学习相关的算法思想、解题技巧和常见题目。

  3. 算法题目的分类总结

分类 题目类型 学习目标 刷题建议
数组 查找、排序、滑动窗口 掌握数组的基本操作,理解不同算法在数组上的应用 熟悉各种排序算法,练习使用滑动窗口解决问题
链表 插入、删除、反转 掌握链表的基本操作,理解链表的特性 练习链表的各种操作,例如反转、合并、查找等
遍历、查找、平衡 理解树的结构和特性,掌握树的各种遍历方法 练习树的各种遍历算法,理解树的平衡性

此外,要培养良好的编程习惯,增强 debug 能力,leetcode的测试用例可以帮你更好地debug。熟练掌握这些技巧,可以让你更加高效地刷LeetCode,更扎实地掌握算法技能。

LeetCode刷题方法及建议

LeetCode有效刷题策略

LeetCode作为程序员提升算法能力的重要平台,合理的刷题策略至关重要。以下是一些建议,可以帮助你更有效地利用LeetCode。

1. 制定刷题计划:

  • 目标明确: 设定明确的刷题目标,例如每天完成一定数量的题目,或每周攻克特定类型的算法问题。
  • 循序渐进: 从简单题开始,逐步挑战中等和困难题目,建立扎实的基础。
  • 分类练习: 按照数据结构和算法类型(如数组、链表、二叉树、动态规划等)进行分类练习,针对性地提升特定技能。

2. 注重理解和总结:

  • 理解题意: 仔细阅读题目描述,确保完全理解题目的要求和限制。
  • 分析思路: 在编写代码之前,先进行充分的思考和分析,确定合适的算法思路。
  • 编写代码: 将思路转化为代码,注意代码的规范性和可读性。
  • 测试用例: 编写充分的测试用例,确保代码能够正确处理各种情况。
  • 总结反思: 完成题目后,回顾解题思路和代码实现,总结经验和教训,并尝试寻找更优的解法。

3. 积极参与讨论:

  • 学习他人思路: LeetCode 讨论区是一个宝贵的资源,可以学习其他人的解题思路和代码实现。
  • 分享经验: 在讨论区分享自己的解题思路和代码,与其他学习者交流互动。
  • 参与竞赛: LeetCode 竞赛是一个检验和提升算法能力的绝佳平台。通过参与竞赛,可以锻炼自己的解题速度和应变能力。

4. 重视时间复杂度分析:

  • 评估算法效率: 在编写代码时,需要考虑算法的时间复杂度和空间复杂度,选择效率最高的算法。
  • 优化代码: 对于时间复杂度较高的代码,需要进行优化,例如使用更高效的数据结构或算法。

5. 持之以恒,循序渐进:

  • 长期坚持: 算法能力的提升需要长期积累,每天坚持刷题,才能看到效果。
  • 不要气馁: 遇到困难题目时,不要气馁,可以先学习相关知识,或参考他人思路,逐步攻克。

通过合理的刷题策略,结合本文提供的题解,相信大家一定能够在 LeetCode 平台上取得更大的进步,提升自身的编程能力。

LeetCode 竞赛的优缺点分析

? Pros

提升算法能力:LeetCode 竞赛能够有效地提升参赛者的算法能力和编程技巧。

锻炼解题速度:竞赛的限时要求能够锻炼参赛者的解题速度和应变能力。

促进交流学习:竞赛平台提供了讨论区,方便参赛者交流学习。

检验学习成果:竞赛是一个检验学习成果的有效方式,可以了解自身在算法方面的优势和不足。

? Cons

时间压力大:竞赛的限时要求可能会给参赛者带来一定的压力。

题目难度高:部分竞赛题目的难度较高,可能会让初学者感到沮丧。

需要一定的基础:参与竞赛需要一定的算法基础,不适合完全没有基础的初学者。

常见问题解答 (FAQ)

什么是 LeetCode 竞赛?

LeetCode 竞赛是由 LeetCode 平台组织的在线编程竞赛。参赛者需要在限定时间内解决一系列算法问题,并根据解题的正确性和效率进行排名。LeetCode 竞赛是提升算法能力和编程技巧的绝佳平台。

如何有效提升算法能力?

提升算法能力需要长期积累和刻意练习。以下是一些建议: 掌握基础知识: 熟练掌握常用的数据结构和算法,例如数组、链表、二叉树、排序、搜索等。 刻意练习: 在 LeetCode 等平台上进行大量的练习,从简单题开始,逐步挑战中等和困难题目。 分析总结: 完成题目后,回顾解题思路和代码实现,总结经验和教训,并尝试寻找更优的解法。 参与讨论: 学习其他人的解题思路和代码实现,与其他学习者交流互动。

如何选择合适的编程语言来刷 LeetCode?

编程语言的选择主要取决于个人的喜好和擅长程度。LeetCode 支持多种编程语言,包括 C++、Java、Python 等。建议选择自己最熟悉和擅长的语言,这样可以更专注于算法思路的实现,而不用花费过多精力在语言特性上。对于初学者,Python 通常是一个不错的选择,因为它语法简洁易懂,能够快速上手。

相关问题拓展

除了 LeetCode 之外,还有哪些学习算法的资源?

LeetCode 是一个非常棒的平台,但并非唯一的选择。以下列出一些可以辅助学习算法的资源: 书籍: 《算法导论》、《算法》、《数据结构与算法分析》等经典书籍可以帮助你系统地学习算法知识。 在线课程: Coursera、edX、Udacity 等平台提供了许多优质的算法课程,可以跟随课程进行学习。 博客和论坛: Stack Overflow、CSDN 等网站上有很多关于算法问题的讨论和解答,可以参考学习。 开源项目: GitHub 上有很多优秀的算法项目,可以阅读源码学习算法的实现。

以上就是LeetCode 竞赛题解:掌握算法技巧,提升编程能力的详细内容,更多请关注php中文网其它相关文章!

编程速学教程(入门课程)
编程速学教程(入门课程)

编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号