From 7011c075afba13e927c171924018f6600b1c7203 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Wed, 19 Aug 2020 10:33:07 +0800 Subject: [PATCH] Update --- README.md | 17 +++-- pics/93_复原IP地址.png | Bin 0 -> 44492 bytes ...83.删除排序链表中的重复元素.md | 2 +- problems/0093.复原IP地址.md | 63 ++++++++++++++++++ problems/0131.分割回文串.md | 49 ++++++++++++++ problems/0349.两个数组的交集.md | 31 ++++++--- problems/0383.赎金信.md | 9 +-- 7 files changed, 154 insertions(+), 17 deletions(-) create mode 100644 pics/93_复原IP地址.png create mode 100644 problems/0093.复原IP地址.md create mode 100644 problems/0131.分割回文串.md diff --git a/README.md b/README.md index be72f97b..9a5ad2cb 100644 --- a/README.md +++ b/README.md @@ -28,12 +28,18 @@ * [这六道哈希表相关的面试题,你一定要会!](https://mp.weixin.qq.com/s/nxuWv5cUhCPSbAdIHtWgSg) * [关于链表,你该了解这些!](https://mp.weixin.qq.com/s/ntlZbEdKgnFQKZkSUAOSpQ) * [刷leetcode的时候,究竟什么时候可以使用库函数,什么时候不要使用库函数,过来人来说一说](https://leetcode-cn.com/circle/article/E1Kjzn/) +* [链表:听说用虚拟头节点会方便很多?](https://mp.weixin.qq.com/s/slM1CH5Ew9XzK93YOQYSjA) +* [链表:一道题目考察了常见的五个操作!](https://mp.weixin.qq.com/s/Cf95Lc6brKL4g2j8YyF3Mg) +* [链表:听说过两天反转链表又写不出来了?](https://mp.weixin.qq.com/s/pnvVP-0ZM7epB8y3w_Njwg) +* [链表:环找到了,那入口呢?](https://mp.weixin.qq.com/s/_QVP3IkRZWx9zIpQRgajzA) +* [哈希表:可以拿数组当哈希表来用,但哈希值不要太大](https://mp.weixin.qq.com/s/vM6OszkM6L1Mx2Ralm9Dig) * 精选链表相关的面试题 * 精选字符串相关的面试题 * 精选栈与队列相关的面试题 * 精选二叉树相关的面试题 * 精选递归与回溯面试题 + (持续更新中....) # LeetCode 刷题攻略 @@ -50,10 +56,10 @@ * [0059.螺旋矩阵II](https://github.com/youngyangyang04/leetcode/blob/master/problems/0059.螺旋矩阵II.md) * 链表经典题目 - * [0203.移除链表元素](https://github.com/youngyangyang04/leetcode/blob/master/problems/0203.移除链表元素.md) - * [0707.设计链表](https://github.com/youngyangyang04/leetcode/blob/master/problems/0707.设计链表.md) - * [0206.翻转链表](https://github.com/youngyangyang04/leetcode/blob/master/problems/0206.翻转链表.md) - * [0142.环形链表II](https://github.com/youngyangyang04/leetcode/blob/master/problems/0142.环形链表II.md) + * [0203.移除链表元素](https://mp.weixin.qq.com/s/slM1CH5Ew9XzK93YOQYSjA) + * [0707.设计链表](https://mp.weixin.qq.com/s/Cf95Lc6brKL4g2j8YyF3Mg) + * [0206.翻转链表](https://mp.weixin.qq.com/s/pnvVP-0ZM7epB8y3w_Njwg) + * [0142.环形链表II](https://mp.weixin.qq.com/s/_QVP3IkRZWx9zIpQRgajzA) * 哈希表经典题目 * [0242.有效的字母异位词](https://github.com/youngyangyang04/leetcode/blob/master/problems/0242.有效的字母异位词.md) @@ -335,6 +341,7 @@ int countNodes(TreeNode* root) { |---|---| ---| --- | |[0001.两数之和](https://github.com/youngyangyang04/leetcode/blob/master/problems/0001.两数之和.md) | 数组|简单|**暴力** **哈希**| |[0015.三数之和](https://github.com/youngyangyang04/leetcode/blob/master/problems/0015.三数之和.md) | 数组 |中等|**双指针** **哈希**| +|[0017.电话号码的字母组合](https://github.com/youngyangyang04/leetcode/blob/master/problems/0017.电话号码的字母组合.md) | 回溯 |中等|**回溯**| |[0018.四数之和](https://github.com/youngyangyang04/leetcode/blob/master/problems/0018.四数之和.md) | 数组 |中等|**双指针**| |[0020.有效的括号](https://github.com/youngyangyang04/leetcode/blob/master/problems/0020.有效的括号.md) | 栈 |简单|**栈**| |[0021.合并两个有序链表](https://github.com/youngyangyang04/leetcode/blob/master/problems/0021.合并两个有序链表.md) |链表 |简单|**模拟** | @@ -345,6 +352,7 @@ int countNodes(TreeNode* root) { |[0053.最大子序和](https://github.com/youngyangyang04/leetcode/blob/master/problems/0053.最大子序和.md) |数组 |简单|**暴力** **贪心** 动态规划 分治| |[0059.螺旋矩阵II](https://github.com/youngyangyang04/leetcode/blob/master/problems/0059.螺旋矩阵II.md) |数组 |中等|**模拟**| |[0083.删除排序链表中的重复元素](https://github.com/youngyangyang04/leetcode/blob/master/problems/0083.删除排序链表中的重复元素.md) |链表 |简单|**模拟**| +|[0093.复原IP地址](https://github.com/youngyangyang04/leetcode/blob/master/problems/0093.复原IP地址) |回溯 |中等|**回溯**| |[0094.二叉树的中序遍历](https://github.com/youngyangyang04/leetcode/blob/master/problems/0094.二叉树的中序遍历.md) |树 |中等|**递归** **迭代/栈**| |[0098.验证二叉搜索树](https://github.com/youngyangyang04/leetcode/blob/master/problems/0098.验证二叉搜索树.md) |树 |中等|**递归**| |[0100.相同的树](https://github.com/youngyangyang04/leetcode/blob/master/problems/0100.相同的树.md) |树 |简单|**递归** | @@ -353,6 +361,7 @@ int countNodes(TreeNode* root) { |[0104.二叉树的最大深度](https://github.com/youngyangyang04/leetcode/blob/master/problems/0104.二叉树的最大深度.md) |树 |简单|**递归** **迭代/队列/BFS**| |[0110.平衡二叉树](https://github.com/youngyangyang04/leetcode/blob/master/problems/0110.平衡二叉树.md) |树 |简单|**递归**| |[0111.二叉树的最小深度](https://github.com/youngyangyang04/leetcode/blob/master/problems/0111.二叉树的最小深度.md) |树 |简单|**递归** **队列/BFS**| +|[0131.分割回文串](https://github.com/youngyangyang04/leetcode/blob/master/problems/0131.分割回文串.md) |回溯 |中等|**回溯**| |[0142.环形链表II](https://github.com/youngyangyang04/leetcode/blob/master/problems/0142.环形链表II.md) |链表 |中等|**快慢指针/双指针**| |[0144.二叉树的前序遍历](https://github.com/youngyangyang04/leetcode/blob/master/problems/0144.二叉树的前序遍历.md) |树 |中等|**递归** **迭代/栈**| |[0145.二叉树的后序遍历](https://github.com/youngyangyang04/leetcode/blob/master/problems/0145.二叉树的后序遍历.md) |树 |困难|**递归** **迭代/栈**| diff --git a/pics/93_复原IP地址.png b/pics/93_复原IP地址.png new file mode 100644 index 0000000000000000000000000000000000000000..8e3a9febdaeb9ee62276d0dd5afcac8c10fb01a8 GIT binary patch literal 44492 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 更过算法干货文章持续更新,可以微信搜索「代码随想录」第一时间围观,关注后,回复「Java」「C++」 「python」「简历模板」「数据结构与算法」等等,就可以获得我多年整理的学习资料。 +> 更多算法干货文章持续更新,可以微信搜索「代码随想录」第一时间围观,关注后,回复「Java」「C++」 「python」「简历模板」「数据结构与算法」等等,就可以获得我多年整理的学习资料。 diff --git a/problems/0093.复原IP地址.md b/problems/0093.复原IP地址.md new file mode 100644 index 00000000..66ad1ec6 --- /dev/null +++ b/problems/0093.复原IP地址.md @@ -0,0 +1,63 @@ +## 题目地址 +https://leetcode-cn.com/problems/restore-ip-addresses/ + +## 思路 + + +## C++代码 + +``` +class Solution { +private: + vector result;// 记录结果 + // startIndex: 搜索的起始位置,pointNum:添加逗点的数量 + void search(string& s, int startIndex, int pointNum) { + if (pointNum == 3) { // 逗点数量为3时,分隔结束 + // 判断第四段子字符串是否合法,如果合法就放进result中 + if (isValid(s, startIndex, s.size() - 1)) { + result.push_back(s); + } + return; + } + // 从起始位置开始构造字段字符串串 + for (int i = startIndex; i < s.size(); i++) { + // 判断 [startIndex,i] 这个区间的子串是否合法 + if (isValid(s, startIndex, i)) { + // 合法,在i的后面插入一个逗点 + s.insert(s.begin() + i + 1 , '.'); + // 插入逗点之后下一个子串的起始位置为i+2 + search(s, i + 2, pointNum + 1); + s.erase(s.begin() + i + 1); // 回溯时删掉逗点 + } else break; + } + } + // 判断字符串s在左闭又闭区间[start, end]所组成的数字是否合法 + bool isValid(const string& s, int start, int end) { + if (start > end) { + return false; + } + if (s[start] == '0' && start != end) {// 0开头的数字不合法 + return false; + } + int num = 0; + for (int i = start; i <= end; i++) { + if (s[i] > '9' || s[i] < '0') { // 遇到非数字字符不合法 + return false; + } + num = num * 10 + (s[i] - '0'); + if (num > 255) { // 如果大于255了不合法 + return false; + } + } + return true; + } +public: + vector restoreIpAddresses(string s) { + result.clear(); + search(s, 0, 0); + return result; + } +}; +``` + +> 更多算法干货文章持续更新,可以微信搜索「代码随想录」第一时间围观,关注后,回复「Java」「C++」 「python」「简历模板」「数据结构与算法」等等,就可以获得我多年整理的学习资料。 diff --git a/problems/0131.分割回文串.md b/problems/0131.分割回文串.md new file mode 100644 index 00000000..9cae7bdd --- /dev/null +++ b/problems/0131.分割回文串.md @@ -0,0 +1,49 @@ + +## 题目地址 +https://leetcode-cn.com/problems/palindrome-partitioning/ + +## 思路 + + +## C++代码 +``` +class Solution { +private: + vector> result; + + // startIndex: 搜索的起始位置,vec: 放已经回文的子串 + void search(const string& s, int startIndex, vector& vec) { + // 如果起始位置已经大于s的大小,说明已经找到了一组分割方案了 + if (startIndex >= s.size()) { + result.push_back(vec); + return; + } + for (int i = startIndex; i < s.size(); i++) { + if (isPalindrome(s, startIndex, i)) { // 是回文子串 + // 获取[startIndex,i]在s中的子串 + string str = s.substr(startIndex, i - startIndex + 1); + vec.push_back(str); + } else { // 如果不是则直接跳过 + continue; + } + search(s, i + 1, vec); // 寻找i+1为起始位置的子串 + vec.pop_back(); // 回溯过程,弹出本次已经填在的子串 + } + } + bool isPalindrome(const string& s, int start, int end) { + for (int i = start, j = end; i < j; i++, j--) { + if (s[i] != s[j]) { + return false; + } + } + return true; + } +public: + vector> partition(string s) { + result.clear(); + vector vec; + search(s, 0 , vec); + return result; + } +}; +``` diff --git a/problems/0349.两个数组的交集.md b/problems/0349.两个数组的交集.md index 2f36c503..408ef931 100644 --- a/problems/0349.两个数组的交集.md +++ b/problems/0349.两个数组的交集.md @@ -2,21 +2,35 @@ ## 题目地址 https://leetcode-cn.com/problems/intersection-of-two-arrays/ -## 思路 +> 如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费! -这道题目,主要要学会使用一种哈希数据结构,unordered_set,这个数据结构可以解决很多类似的问题。 +# 第349题. 两个数组的交集 + +题意:给定两个数组,编写一个函数来计算它们的交集。 + +![349. 两个数组的交集](https://img-blog.csdnimg.cn/20200818193523911.png) + +**说明:** +输出结果中的每个元素一定是唯一的。 +我们可以不考虑输出结果的顺序。 + +# 思路 + +这道题目,主要要学会使用一种哈希数据结构:unordered_set,这个数据结构可以解决很多类似的问题。 注意题目特意说明:**输出结果中的每个元素一定是唯一的,也就是说输出的结果的去重的, 同时可以不考虑输出结果的顺序** -这道题用暴力的解法时间复杂度是O(n^2),这种解法面试官一定不会满意,那看看使用哈希法进一步优化。 +这道题用暴力的解法时间复杂度是O(n^2),那来看看使用哈希法进一步优化。 -那么可以发现,貌似用数组做哈希表可以解决这道题目,把nums1的元素,映射到哈希数组的下表上,然后在遍历nums2的时候,判断是否出现过就可以了。 +可以发现,貌似用数组做哈希表可以解决这道题目,把nums1的元素,映射到哈希数组的下表上,然后在遍历nums2的时候,判断是否出现过就可以了。 -但是要注意,使用数据来做哈希的题目,都限制了数值的大小,例如只有小写字母,或者数值大小在[0- 10000] 之内等等。 而这道题目没有限制数值的大小,就无法使用数组来做哈希表了。 +但是要注意,**使用数据来做哈希的题目,都限制了数值的大小,例如[哈希表:可以拿数组当哈希表来用,但哈希值不要太大](https://mp.weixin.qq.com/s/vM6OszkM6L1Mx2Ralm9Dig)题目中只有小写字母,或者数值大小在[0- 10000] 之内等等。** -例如说:如果我的输入样例是这样的, 难道要定义一个2亿大小的数组来做哈希表么, 不同的语言对数组定义的大小都是有限制的, 即使有的语言可以定义这么大的数组,那也是对内存空间造成了非常大的浪费。 +而这道题目没有限制数值的大小,就无法使用数组来做哈希表了。 -此时就要使用另一种结构体了,set ,关于set,C++ 给提供了如下三种可用的数据结构 +**而且如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费。** + +此时就要使用另一种结构体了,set ,关于set,C++ 给提供了如下三种可用的数据结构: * std::set * std::multiset @@ -25,9 +39,10 @@ https://leetcode-cn.com/problems/intersection-of-two-arrays/ std::set和std::multiset底层实现都是红黑树,std::unordered_set的底层实现是哈希表, 使用unordered_set 读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set。 思路如图所示: + ![set哈希法](https://img-blog.csdnimg.cn/2020080918570417.png) -## 代码 +# C++代码 ``` class Solution { public: diff --git a/problems/0383.赎金信.md b/problems/0383.赎金信.md index 3a474d3a..2a72ab56 100644 --- a/problems/0383.赎金信.md +++ b/problems/0383.赎金信.md @@ -3,7 +3,9 @@ https://leetcode-cn.com/problems/ransom-note/ ## 思路 -这道题题意很清晰,就是用判断第一个字符串ransom能不能由第二个字符串magazines里面的字符构成,但是这里需要注意两点1. +这道题目和[242.有效的字母异位词](https://mp.weixin.qq.com/s/vM6OszkM6L1Mx2Ralm9Dig)很像,[242.有效的字母异位词](https://mp.weixin.qq.com/s/vM6OszkM6L1Mx2Ralm9Dig)相当于求 字符串a 和 字符串b 是否可以相互组成 ,而这道题目是求 字符串a能否组成字符串b,而不用管字符串b 能不能组成字符串a。 + +本题判断第一个字符串ransom能不能由第二个字符串magazines里面的字符构成,但是这里需要注意两点1. *  第一点“为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思”  这里*说明杂志里面的字母不可重复使用。* @@ -37,13 +39,12 @@ public: }; ``` -这里时间复杂度是比较高的,而且里面还有一个字符串删除也就是erase的操作,也是费时的,当然这段代码也可以过这道题 +这里时间复杂度是比较高的,而且里面还有一个字符串删除也就是erase的操作,也是费时的,当然这段代码也可以过这道题。 -我们想一想优化解法 ## 字典计数法(哈希策略) -因为题目所只有小写字母,那我们可以采用空间换区时间的哈希策略, 用一个长度为26的数组还记录magazine里字母出现的次数,然后再用ransomNote去验证这个数组是否包含了ransomNote所需要的所有字母。 +因为题目所只有小写字母,那可以采用空间换区时间的哈希策略, 用一个长度为26的数组还记录magazine里字母出现的次数,然后再用ransomNote去验证这个数组是否包含了ransomNote所需要的所有字母。 代码如下: ```C++