【LeetCode 热题 HOT 100】题解笔记 —— Day01

❤ 作者主页:欢迎来到我的技术博客😎
❀ 个人介绍:大家好,本人热衷于Java后端开发,欢迎来交流学习哦!( ̄▽ ̄)~*
🍊 如果文章对您有帮助,记得关注点赞收藏评论⭐️⭐️⭐️
📣 您的支持将是我创作的动力,让我们一起加油进步吧!!!🎉🎉

文章目录

  • 一、两数之和
    • 1. 题目描述
    • 2. 思路分析
    • 3. 代码实现
  • 二、两数相加
    • 1. 题目描述
    • 2. 思路分析
    • 3. 代码实现
  • 三、无重复字符的最长子串
    • 1. 题目描述
    • 2. 思路分析
    • 3. 代码实现
  • 四、寻找两个正序数组的中位数
    • 1. 题目描述
    • 2. 思路分析
    • 3. 代码实现
  • 五、最长回文子串
    • 1. 题目描述
    • 2. 思路分析
    • 3. 代码实现
  • 六、正则表达式匹配
    • 1. 题目描述
    • 2. 思路分析
    • 3. 代码实现
  • 七、盛最多水的容器
    • 1. 题目描述
    • 2. 思路分析
    • 3. 代码实现
  • 八、三数之和
    • 1. 题目描述
    • 2. 思路分析
    • 3. 代码实现
  • 九、电话号码的字母组合
    • 1. 题目描述
    • 2. 思路分析
    • 3. 代码实现
  • 十、删除链表的倒数第 N 个结点
    • 1. 题目描述
    • 2. 思路分析
    • 3. 代码实现

一、两数之和

1. 题目描述

在这里插入图片描述


2. 思路分析

最容易想到的方法是枚举数组中的每一个数 x x x,寻找数组中是否存在 t a r g e t − x target - x targetx

使用哈希表,可以将寻找 t a r g e t − x target - x targetx 的时间复杂度降低到从 O ( N ) O(N) O(N) 降低到 O ( 1 ) O(1) O(1)

循环一遍nums数组,在每步循环中做两件事:
1、判断 target - nums[i] 是否出现在哈希表中;
2、将 nums[i] 插入到哈希表中。


3. 代码实现

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> heap;for (int i = 0; i < nums.size(); i ++) {int r = target - nums[i];if (heap.count(r)) return {heap[r], i};heap[nums[i]] = i;}return {};}
};

二、两数相加

1. 题目描述

在这里插入图片描述


2. 思路分析

(模拟人工加法) O(n)
这是一道模拟题,直接模拟列竖式做加法的过程:

  1. 从最低位至最高位,逐位相加,如果大于和等于10,则保留个位数字,同时向前一位加1;
  2. 如果最高位有进位,则需在最前面补1。

列表的题目,有个常见的技巧:
添加一个虚拟头结点:ListNode *head = new ListNode(-1);,这样可以简化边界情况的判断。

时间复杂度:由于总共共扫描一遍,所以时间复杂度是O(n)。


3. 代码实现

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {auto dummy = new ListNode(-1), cur = dummy;int t = 0;while (l1 || l2 || t) {if (l1) t += l1->val, l1 = l1->next;if (l2) t += l2->val, l2 = l2->next;cur = cur->next = new ListNode(t % 10);t /= 10;}return dummy->next;}
};

三、无重复字符的最长子串

1. 题目描述

在这里插入图片描述


2. 思路分析

定义两个指针 i , j ( i < = j ) i,j(i <= j) i,j(i<=j), 表示当前扫描到的子串是 [ i , j ] [i,j] [i,j](闭区间)。扫描过程中维护一个哈希表unorderes_map<char, int> hash, 表示 [ i , j ] [i,j] [i,j] 中每个字符出现的个数。

线性扫描,每次循环的流程如下:

  1. 指针 j j j 向后移一位,同时将哈希表中 s [ j ] s[j] s[j] 的计数加一:hash[s[j]] ++;
  2. 假设 j j j 移动前的区间 [ i , j ] [i,j] [i,j] 中没有重复字符,则 j j j 移动后,只有 s [ j ] s[j] s[j] 可能出现2次。因此我们不断向后移动 i i i,直至区间 [ i , j ] [i,j] [i,j] s [ j ] s[j] s[j] 的个数等于1为止。

3. 代码实现

class Solution {
public:int lengthOfLongestSubstring(string s) {unordered_map<char, int> heap;int res = 0;for (int i = 0, j = 0; i < s.size(); i ++) {            heap[s[i]] ++;while (heap[s[i]] > 1) heap[s[j ++]] --;res = max(res, i - j + 1);}return res;}
};

四、寻找两个正序数组的中位数

1. 题目描述

在这里插入图片描述


2. 思路分析

3. 代码实现


五、最长回文子串

1. 题目描述

在这里插入图片描述


2. 思路分析

暴力枚举 O( 2 2 2^2 22)
首先枚举回文串的中心 i i i,然后分两种情况向两边扩展,直到遇到不同字符为止:

  • 回文串长度是奇数,则依次判断 s [ i − k ] = = s [ i + k ] , k = 1 , 2 , 3..... s[i - k] == s[i + k], k = 1, 2,3..... s[ik]==s[i+k],k=1,2,3.....
  • 回文串长度是偶数,则依次判断 s [ i + k ] = = s [ i + k − 1 ] , k = 1 , 2 , 3.... s[i + k] == s[i + k - 1], k = 1, 2, 3.... s[i+k]==s[i+k1],k=1,2,3....

如果遇到不同字符,则我们找到了以 i i i 为中心的回文字符串边界。


3. 代码实现

class Solution {
public:string longestPalindrome(string s) {string res;for (int i = 0; i < s.size(); i ++ ) {int l = i - 1, r = i + 1;while (l >= 0 && r < s.size() && s[l] == s[r]) l --, r ++;if (res.size() < r - l - 1) res = s.substr(l + 1, r - l - 1);l = i, r = i + 1;while (l >= 0 && r < s.size() && s[l] == s[r]) l --, r ++;if (res.size() < r - l - 1) res = s.substr(l + 1, r - l - 1);}return res;}
};

六、正则表达式匹配

1. 题目描述

在这里插入图片描述


2. 思路分析

3. 代码实现


七、盛最多水的容器

1. 题目描述

在这里插入图片描述


2. 思路分析

  1. 初始化: 双指针 i i i j j j分别指向水槽的左右两端;
  2. 循环收窄: 直至双指针相遇时跳出;
    1. 更新面积最大值 r e s res res
    2. 选定两板高度中的短板,向中间收窄一格;
  3. 返回值: 返回面积最大值 r e s res res 即可。

3. 代码实现

class Solution {
public:int maxArea(vector<int>& height) {int res = 0;for (int i = 0, j = height.size() - 1; i < j;) {res = max(res, min(height[i], height[j]) * (j - i));if (height[i] > height[j]) j --;else i ++; } return res;}
};

八、三数之和

1. 题目描述

在这里插入图片描述


2. 思路分析

双指针算法 O ( n 2 ) O(n^2) O(n2)

  1. 枚举每个数,先确定 n u m s [ i ] nums[i] nums[i],在排序后的情况下,通过双指针 j j j k k k 分别从左边 j = i + 1 j = i + 1 j=i+1 和右边 k = n − 1 k = n - 1 k=n1 往中间靠拢,找到 n u m s [ i ] + n u m s [ j ] + n u m s [ k ] = = 0 nums[i] + nums[j] + nums[k] == 0 nums[i]+nums[j]+nums[k]==0 的所有符合条件的搭配;
  2. 判重处理:i > 0(i不是第一个数) && nums[i] == nums[i - 1],表示当前确定好的数与上一个一样,需要直接 o n t i n u e ontinue ontinue,同理,j && nums[j] == nums[j-1] 需要直接 c o n t i n u e continue continue;
  3. while(j < k - 1 && nums[i] + nums[j] + nums[k - 1] >= 0) k -- //要找到满足最小的 k k k
    为什么 j < k − 1 j < k - 1 j<k1
    试探法,如果 k k k 的下一个数( k k k的左边的数)满足就用下一个数。

3. 代码实现

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> res;sort(nums.begin(), nums.end());for (int i = 0; i < nums.size(); i ++ ) {if (i && nums[i] == nums[i - 1]) continue;for (int j = i + 1, k = nums.size() - 1; j < k; j ++ ) {if (j > i + 1 && nums[j] == nums[j - 1]) continue;while (j < k - 1 && nums[i] + nums[j] + nums[k - 1] >= 0) k --;if (nums[i] + nums[j] + nums[k] == 0) {res.push_back({nums[i], nums[j], nums[k]});}}}return res;}
};

九、电话号码的字母组合

1. 题目描述

在这里插入图片描述


2. 思路分析

  • 这是个排列组合问题,这个排列组合可以用树的形式表示出来;
  • 当给定了输入字符串,比如:“23”,那么整棵树就构建完成了,如下:
    在这里插入图片描述
  • 问题转化成了从根节点到空节点一共有多少条路径。

3. 代码实现

class Solution {
public:vector<string> ans;string strs[10] = {"", "", "abc", "def","ghi", "jkl", "mno","pqrs", "tuv", "wxyz",};vector<string> letterCombinations(string digits) {if (digits.empty()) return ans;dfs(digits, 0, "");return ans;}void dfs(string& digits, int u, string path) {if (u == digits.size()) ans.push_back(path);else {for (auto c : strs[digits[u] - '0']) dfs(digits, u + 1, path + c);}}
};

十、删除链表的倒数第 N 个结点

1. 题目描述

在这里插入图片描述


2. 思路分析

(两次遍历) O ( L ) O(L) O(L)

  1. 第一次遍历求出链表的长度。
  2. 第二次遍历删掉指定结点。

3. 代码实现

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {auto dummy = new ListNode(-1);dummy->next = head;int len = 0;for (auto p = dummy; p; p = p->next) len ++;auto p = dummy;for (int i = 0; i < len - n - 1; i ++) p = p->next;p->next = p->next->next;return dummy->next;}
};

 
非常感谢您阅读到这里,如果这篇文章对您有帮助,希望能留下您的点赞👍 关注💖 分享👥 留言💬thanks!!!

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

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

相关文章

远程网络监控(RMON)

远程网络监控是一个使 IT 团队能够获得远程网络可见性的过程&#xff0c;它涉及主动监控网络以帮助网络无缝运行&#xff0c;这些监控远程网络的系统提供对性能的实时洞察&#xff0c;及时检测问题并在影响最终用户之前解决问题。这样&#xff0c;远程网络虽然相距遥远&#xf…

洛谷P1049装箱问题 ————递归+剪枝+回溯

没没没没没没没没没错&#xff0c;又是一道简单的递归&#xff0c;只不过加了剪枝&#xff0c;我已经不想再多说&#xff0c;这道题写了一开始写了普通深搜&#xff0c;然后tle了一个点&#xff0c;后面改成剪枝&#xff0c;就ac了&#xff0c;虽然数据很水&#xff0c;但是不妨…

类和对象(3)日期类的实现

日期类的实现 一&#xff0c;声明二&#xff0c;函数成员定义2.1构造函数2.2获取月份天数2.3比较运算符2.3.1等于和大于2.3.2其他 2.4计算运算符2.4.1 &&2.4.2-&&- 2.5日期-日期 一&#xff0c;声明 class Date { public:Date(int year 1, int month 1, int…

[BJDCTF 2020]easy_md5

md5(string,raw) 所以首先我们要找到一个字符串&#xff0c;这个字符串经过md5得到的16位原始二进制的字符串能帮我们实现sql注入。 我们的目标就是要找一个字符串取32位16进制的md5值里带有276f7227这个字段的&#xff0c;接着就是要看关键的数字部分了&#xff0c;在276f72…

自动语音识别 支持86种语言 Dragon Professional 16 Crack

从个体从业者到全球组织&#xff0c;文档密集型行业的专业人士长期以来一直依靠 Dragon 语音识别来更快、更高效地创建高质量文档&#xff0c;减少管理开销&#xff0c;以便他们能够专注于客户。了解 Dragon Professional v16 如何通过单一解决方案提高标准&#xff0c;为各个业…

Clion在Windows下build时出现undefined reference,即使cmake已经正确链接第三方库(如protobuf)?

你是否正在使用clion自带的vcpkg来安装了protobuf&#xff1f; 或者你是否自己使用visual studio自己编译了libprotobuf.lib&#xff1f; 你是否已经正确在CmakeLists.txt中添加了以下命令&#xff1a; find_package(Protobuf CONFIG REQUIRED) include_directories(${Protobu…

c++数学表达式解析求值库推荐

让程序支持自定义的数学计算器是常用功能&#xff0c;找了几个用来数学表达式解析求值的库&#xff0c;有几个看起来很不错。 各个数学表达式求值的综合对比 对比结果如下&#xff0c;ExprTK得分最高&#xff0c; TinyExpr得分最低&#xff0c; GitHub - ArashPartow/math-par…

新版画中画documentPictureInPicture API使用

关于该API&#xff0c;chrome dev有一篇比较好入门的文章&#xff0c;如果你没看过强烈推荐你先看这篇基础用法&#xff0c;该文章只针对API的特性和chrome dev文章进行扩展性说明。 提前说明&#xff0c;目前该API是非w3c草案功能&#xff0c;从chrome 116开始已经强推到stabl…

ASO优化之如何测试应用的屏幕截图

截取屏幕截图并上传到应用商店后&#xff0c;我们需要对其进行测试和优化&#xff0c;从而来获得更高的转化率&#xff0c;精美的图片有助于提高应用在商店的安装率。 1、定义目标受众。 战略性地决定测试哪些目标受众&#xff0c;可以通过年龄、性别、地点、兴趣等来定义我们…

超声波雪深传感器冬季里的科技魔法

在冬季的某个清晨&#xff0c;当你打开大门&#xff0c;被厚厚的积雪覆盖的大地映入眼帘&#xff0c;你是否曾想过&#xff0c;这片雪地的深度是多少&#xff1f;它又如何影响着我们的生活和环境&#xff1f;今天&#xff0c;我们将为你揭开这个谜团&#xff0c;介绍一款神秘的…

AHSATA模块之AHCI HBA卡开发,结合SPEC文档和项目实际底层FW开发总结(一)

目录 一、简介二、总体架构和常用术语总结2.1 总结介绍2.2 常用术语解析 三、详细流程3.1 总结3.2 物理层详解3.3 链路层、传输层详解3.4 命令层详解 四、FW开发4.1 pcie header配置4.2 PMCAP和MSICAP配置4.3 pcie capbility配置4.4 Generic Host Control配置4.5 Port Register…

EEG 脑电信号处理合集(2): 信号预处理

脑电信号在采集完以后&#xff0c;需要进行一系列的预处理操作&#xff0c;然后才能用于后续的科学研究和计算。预处理是脑电信号分析最基本且重要的一步。基于python环境MNE库。 1 使用带通滤波器&#xff0c;信号滤波&#xff0c;去噪&#xff0c;去工频干扰 data_path sam…