详细介绍:LeetCode热题100(1-7)

news/2025/10/3 10:54:23/文章来源:https://www.cnblogs.com/slgkaifa/p/19124387

详细介绍:LeetCode热题100(1-7)

目录

一、数组操作篇

1. 移动零(283. Move Zeroes) ​

2. 盛最多水的容器(11. Container With Most Water) ​

二、查找与哈希篇

1. 两数之和(1. Two Sum) ​

2. 字母异位词分组(49. Group Anagrams) ​

三、数组进阶篇

1. 三数之和(15. 3Sum) 

2. 最长连续序列(128. Longest Consecutive Sequence) ​

四、挑战难题篇:接雨水(42. Trapping Rain Water) ​

总结


作为一名算法爱好者,LeetCode是我提升编程能力、锻炼逻辑思维的绝佳平台。今天,我想分享几道LeetCode经典题目,聊聊它们的解法思路和C++实现,希望能给正在刷题的你带来一些启发。

一、数组操作篇

1. 移动零(283. Move Zeroes)


问题描述:给定一个数组,将所有0移动到数组末尾,同时保持非零元素的相对顺序,要求原地操作。

解题思路:使用双指针法,一个指针 pre 追踪非零元素的位置,另一个指针 cur 遍历数组。当 cur 遇到非零元素时,与 pre 位置的元素交换,然后 pre 和 cur 都后移;若遇到0,仅 cur 后移。

C++实现:

class Solution {
public:
    void moveZeroes(vector& nums) {
        int cur = 0, pre = -1;
        while (cur < nums.size()) {
            if (nums[cur] == 0) cur++;
            else {
                swap(nums[++pre], nums[cur++]);
            }
        }
    }
};

2. 盛最多水的容器(11. Container With Most Water)


问题描述:给定n条垂线,找到两条线,使得它们与x轴构成的容器能容纳最多的水。

解题思路:双指针从两端向中间移动。容器的容量由较短的垂线高度和两线间距决定。每次移动较短垂线的指针,因为移动较长垂线的指针不会得到更大的容量。

C++实现:

class Solution {
public:
    int maxArea(vector& height) {
        int heightSize = height.size(), max_area = 0;
        int left = 0, right = heightSize - 1;
        while (left < right) {
            int area = (right - left) * min(height[left], height[right]);
            if (area > max_area) max_area = area;
            if (height[left] < height[right]) left++;
            else right--;
        }
        return max_area;
    }
};

二、查找与哈希篇

1. 两数之和(1. Two Sum)


问题描述:给定数组和目标值,找出和为目标值的两个整数的下标。

解题思路:暴力法是双重循环遍历所有可能的数对,时间复杂度O(n²)。

C++实现:

class Solution {
public:
    vector twoSum(vector& nums, int target) {
        int numsSize = nums.size();
        for (int i = 0; i < numsSize; i++)
            for (int j = i + 1; j < numsSize; j++)
                if (nums[i] + nums[j] == target)
                    return {i, j};
        return {};
    }
};

注:此解法时间复杂度较高,更优的解法是使用哈希表,时间复杂度可降至O(n)。

2. 字母异位词分组(49. Group Anagrams)


问题描述:将字母异位词(字母组成相同,顺序不同的单词)组合在一起。

解题思路:将每个单词排序,排序后的结果作为哈希表的键,相同键的单词属于同一组字母异位词。

C++实现:

class Solution {
public:
    vector> groupAnagrams(vector& strs) {
        unordered_map> hash;
        for (auto s : strs) {
            string tmp = s;
            sort(tmp.begin(), tmp.end());
            hash[tmp].push_back(s);
        }
        vector> ret;
        for (auto& [x, y] : hash)
            ret.push_back(y);
        return ret;
    }
};

三、数组进阶篇

1. 三数之和(15. 3Sum)


问题描述:找出数组中所有和为0的三元组,且不重复。

解题思路:先排序,然后固定一个数,用双指针找另外两个数,同时注意去重(包括固定数的去重和双指针移动时的去重)。

C++实现:

class Solution {
public:
    vector> threeSum(vector& nums) {
        vector> v;
        sort(nums.begin(), nums.end());
        int n = nums.size();
        if (n < 3)
            return {};
        for (int i = 0; i < n - 2; i++) {
            if (i > 0 && nums[i] == nums[i - 1])
                continue;
            int target = -nums[i];
            int left = i + 1, right = n - 1;
            while (left < right) {
                if (nums[left] + nums[right] > target)
                    right--;
                else if (nums[left] + nums[right] < target)
                    left++;
                else {
                    v.push_back({nums[i], nums[left], nums[right]});
                    while (left < right && nums[left] == nums[left + 1])
                        left++;
                    while (left < right && nums[right] == nums[right - 1])
                        right--;
                    left++;
                    right--;
                }
            }
        }
        return v;
    }
};

2. 最长连续序列(128. Longest Consecutive Sequence)


问题描述:给定未排序的整数数组,找出最长连续序列的长度,要求时间复杂度O(n)。

解题思路:先排序,然后遍历数组,统计连续序列的长度,遇到重复元素则跳过。

C++实现:

class Solution {
public:
    int longestConsecutive(vector& nums) {
        if (nums.empty()) return 0;
        sort(nums.begin(), nums.end());
        int len = 0, ret = 0;
        for (int i = 1; i < nums.size(); i++) {
            if (nums[i] - nums[i - 1] == 1) len++;
            else if (nums[i] - nums[i - 1] == 0) continue;
            else {
                ret = max(ret, len);
                len = 0;
            }
        }
        ret = max(ret, len);
        return ret + 1;
    }
};

四、挑战难题篇:接雨水(42. Trapping Rain Water)


问题描述:给定n个非负整数表示柱子的高度图,计算下雨后能接多少雨水。

解题思路:双指针法,分别记录左右的最大高度。如果左最大高度小于右最大高度,当前左柱子能接的雨水由左最大高度决定;否则由右最大高度决定。

C++实现:

class Solution {
public:
    int trap(vector& height) {
        int sz = height.size();
        if (sz < 3) return 0;
        int left = 0, right = sz - 1;
        int leftMax = 0, rightMax = 0;
        int ret = 0;
        while (left < right) {
            leftMax = max(leftMax, height[left]);
            rightMax = max(rightMax, height[right]);
            if (leftMax < rightMax) ret += leftMax - height[left++];
            else ret += rightMax - height[right--];
        }
        return ret;
    }
};

总结

通过这些题目的练习,我们可以总结出一些常见的算法思维和技巧:

- 双指针法:在数组、字符串问题中应用广泛,如两数之和、三数之和、盛最多水的容器、接雨水等。
- 哈希表:用于快速查找、分组,如字母异位词分组、两数之和的优化解法。
- 排序:帮助我们处理重复、连续等问题,如三数之和、最长连续序列。
- 原地操作:通过指针技巧减少空间复杂度,如移动零。


刷题是一个持续积累的过程,每道题都有其独特的思路和价值。希望这篇博客能帮助大家更好地理解这些经典题目,在算法学习的道路上不断进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/925799.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

树莓派搭建NAS之三:使用OpenList挂载网盘

移动硬盘中发现有之前备份的文件,并且监控是一直在写盘,容易将磁盘写坏,之前备份的数据就无法读出。找了半天找到了个不用的32GB的U盘,可以先用着。 U盘的空间太小,连续录制1-2天的时间就会满了,之前的监控也无法…

sg-ss 逆向分析

sg-ss、sgss声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! wx a15018601872 q 27…

网站建设报价比较深圳团购网站设计

在前端Web开发中&#xff0c;下拉筛选功能是一种非常常见的交互方式&#xff0c;它可以帮助用户快速选择所需的选项。本文将介绍如何利用Vue.js和uni-app框架来实现一个高效的下拉筛选功能。通过使用这两个强大的前端框架&#xff0c;我们可以轻松地创建具有响应式用户操作的下…

PySide6 之登录界面设计

一、效果图二、示例代码from PySide6.QtWidgets import QApplication, QWidget from PySide6.QtCore import Qt, Slot, QPoint, QPropertyAnimation, QEasingCurve from PySide6.QtGui import QColorfrom views.login…

Jupyter notebook 虚拟环境(服务)EnvironmentLocationNotFound: Not a conda environment

ErrorAn error occurred while retrieving installed packages. EnvironmentLocationNotFound: Not a conda environment: E:\Eprogramfiles\Anaconda3\envs\Anaconda3 ================================ 网上说修改文…

本地部署overleaf服务帮助latex论文编写 —— 操作笔记

本地部署overleaf服务帮助latex论文编写 —— 操作笔记原文参照: https://www.cnblogs.com/xuhe2/p/18792632操作: git clone https://github.com/xuhe2/sharelatex-ce本博客是博主个人学习时的一些记录,不保证是为…

简述网站开发的三层架构中国建设银行网站转账

近用到Java动态生成背景透明的图片功能&#xff0c;从gif和png中选择了png格式&#xff0c;个中缘由就不说了&#xff0c;于是动手到网上搜索有用的代码。现把搜索结果总结如下&#xff1a;1. 生成png图片int width 400;int height 300;// 创建BufferedImage对象BufferedImag…

怎么免费建立网站广告设计制作公司简介

1. 张量概念 张量本质上是一个n维数组&#xff0c;它在numpy中为ndarray, 在pytorch中称为tensor &#xff0c; 两者的区别在于&#xff1a; numpy仅支持CPU计算tensor能支持GPU运算&#xff0c;并且支持自动微分&#xff0c;更适合深度学习 2. 张量的访问 一个二维矩阵a&a…

【Groovy】Array、List、Set、Map简介

1 Array 1.1 创建数组 1.1.1 创建一维数组 int[] arr1 = new int[2] arr1[0] = 1 arr1[1] = 2float[] arr2 = new float[] { 1f, 2f, 3f } String[] arr3 = ["abc", "xyz"] as String[]1.1.2 创建…

深入解析:【Python高级语法与正则表达式】

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

成都 广告公司网站建设成都建设路小学网站

系统架构师考试是对计算机从业人员&#xff0c;以考代评的重要考试&#xff0c;近几年一直在参加考试&#xff0c;屡战屡败&#xff0c;后又屡败屡战&#xff0c;记录总结论文相关的知识点&#xff0c;方便考前查看。 一、2010年论文 1&#xff09;论软件的静态演化和动态演化…

详细介绍:PandasAI:ChatBI的极简上手版学习(一)

详细介绍:PandasAI:ChatBI的极简上手版学习(一)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

河南网站设计微信云开发平台

#记录工作 提示&#xff1a;整个过程最好先开启系统代理&#xff0c;也可以用镜像源&#xff0c;确保有官方发布的最新特性和官方库的完整和兼容性支持。 期间下载会特别慢&#xff0c;需要在系统上先开启代理&#xff0c;然后WSL设置里打开网络模式“Mirrored”,以设置WSL自动…

深入解析:数字化工艺设计与仿真:汽车制造业成本节约与效率跃升的转型之路

深入解析:数字化工艺设计与仿真:汽车制造业成本节约与效率跃升的转型之路2025-10-03 10:35 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x:…

20届-测试面经-华为OD - 指南

20届-测试面经-华为OD - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

做司考题的网站dw免费网站模板下载

作者&#xff1a;乔二爷&#xff0c;来自&#xff1a;乔二爷&#xff08;ID&#xff1a;hellozhouq&#xff09;1 前言昨天晚上接到阿里的电面电话&#xff0c;过程中就问到了关于缓存相关的问题。虽然以前接触过&#xff0c;多多少少了解了一些。但是之前自己并没有好好记录这…

【大信息技术】ClickHouse配置详细解读

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

做题记录4

CF577B.Modulo Sum 思路 求是否存在一段非空子序列的和模 \(m\) 的值为 \(0\) ,可以先等价地对每一个数字都模 \(m\) 。对于一个长度为 \(n\) 的序列,显然有 \(n\) 段前缀和,并且前缀和模 \(m\) 的值有 \([0, m)\) …

学习unigui【35】dbgrid字段宽度自适应

学习unigui【35】dbgrid字段宽度自适应UniDBGrid1 -> ClientEvents -> ExtEvents [Ext.data.Store[store] ] add store.load fn:function store.load(sender, records, successful, eOpts) {sender.grid.columnM…

网站建设上传宝贝xamp怎样营销能有效获取客户

要用Go获取短信验证码&#xff0c;通常需要连接到一个短信服务提供商的API&#xff0c;并通过该API发送请求来获取验证码。由于不同的短信服务提供商可能具有不同的API和授权方式&#xff0c;我将以一个简单的示例介绍如何使用Go语言来获取短信验证码。 在这个示例中&#xff0…