From cfe3b6d2e4860ed9d16af3f84672e5ee44052ef2 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Thu, 27 Aug 2020 16:27:41 +0800 Subject: [PATCH] Update --- README.md | 17 +++- pics/332.重新安排行程.png | Bin 0 -> 43583 bytes problems/0027.移除元素.md | 128 +++++++++++++--------------- problems/0332.重新安排行程.md | 124 +++++++++++++++++++++++++++ 4 files changed, 195 insertions(+), 74 deletions(-) create mode 100644 pics/332.重新安排行程.png create mode 100644 problems/0332.重新安排行程.md diff --git a/README.md b/README.md index 55d52266..43cc7ebe 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ * [哈希表:其实需要哈希的地方都能找到map的身影](https://mp.weixin.qq.com/s/Ue8pKKU5hw_m-jPgwlHcbA) * [哈希表:这道题目我做过?](https://mp.weixin.qq.com/s/sYZIR4dFBrw_lr3eJJnteQ) * [哈希表:解决了两数之和,那么能解决三数之和么?](https://mp.weixin.qq.com/s/r5cgZFu0tv4grBAexdcd8A) +* [双指针法:一样的道理,能解决四数之和](https://mp.weixin.qq.com/s/nQrcco8AZJV1pAOVjeIU_g) * 精选链表相关的面试题 * 精选字符串相关的面试题 * 精选栈与队列相关的面试题 @@ -65,18 +66,19 @@ * [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) + * [面试题02.07.链表相交](https://github.com/youngyangyang04/leetcode/blob/master/problems/面试题02.07.链表相交.md) * [0142.环形链表II](https://mp.weixin.qq.com/s/_QVP3IkRZWx9zIpQRgajzA) * 哈希表经典题目 * [0242.有效的字母异位词](https://mp.weixin.qq.com/s/vM6OszkM6L1Mx2Ralm9Dig) * [0383.赎金信](https://mp.weixin.qq.com/s/sYZIR4dFBrw_lr3eJJnteQ) * [0575.分糖果](https://github.com/youngyangyang04/leetcode/blob/master/problems/0575.分糖果.md) - * [0349.两个数组的交集](https://github.com/youngyangyang04/leetcode/blob/master/problems/0349.两个数组的交集.md) + * [0349.两个数组的交集](https://mp.weixin.qq.com/s/N9iqAchXreSVW7zXUS4BVA) * [0202.快乐数](https://mp.weixin.qq.com/s/G4Q2Zfpfe706gLK7HpZHpA) * [0001.两数之和](https://mp.weixin.qq.com/s/uVAtjOHSeqymV8FeQbliJQ) * [0454.四数相加II](https://mp.weixin.qq.com/s/Ue8pKKU5hw_m-jPgwlHcbA) - * [0015.三数之和](https://github.com/youngyangyang04/leetcode/blob/master/problems/0015.三数之和.md) - * [0018.四数之和](https://github.com/youngyangyang04/leetcode/blob/master/problems/0018.四数之和.md) + * [0015.三数之和](https://mp.weixin.qq.com/s/r5cgZFu0tv4grBAexdcd8A) + * [0018.四数之和](https://mp.weixin.qq.com/s/nQrcco8AZJV1pAOVjeIU_g) * [0219.存在重复元素II](https://github.com/youngyangyang04/leetcode/blob/master/problems/0219.存在重复元素II.md) * 0220.存在重复元素III @@ -89,6 +91,15 @@ * [0028.实现strStr()](https://github.com/youngyangyang04/leetcode/blob/master/problems/0028.实现strStr().md) * [0459.重复的子字符串](https://github.com/youngyangyang04/leetcode/blob/master/problems/0459.重复的子字符串.md) +* 双指针法经典题目 + * [0015.三数之和](https://github.com/youngyangyang04/leetcode/blob/master/problems/0015.三数之和.md) + * [0018.四数之和](https://github.com/youngyangyang04/leetcode/blob/master/problems/0018.四数之和.md) + * [0026.删除排序数组中的重复项](https://github.com/youngyangyang04/leetcode/blob/master/problems/0026.删除排序数组中的重复项.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) + * [0344.反转字符串](https://github.com/youngyangyang04/leetcode/blob/master/problems/0344.反转字符串.md) + * [剑指Offer05.替换空格](https://github.com/youngyangyang04/leetcode/blob/master/problems/剑指Offer05.替换空格.md) + * 栈与队列经典题目 * [0232.用栈实现队列](https://github.com/youngyangyang04/leetcode/blob/master/problems/0232.用栈实现队列.md) * [0225.用队列实现栈](https://github.com/youngyangyang04/leetcode/blob/master/problems/0225.用队列实现栈.md) diff --git a/pics/332.重新安排行程.png b/pics/332.重新安排行程.png new file mode 100644 index 0000000000000000000000000000000000000000..56f3ab0294222d5aaabad127b99dcfdafb2a46c1 GIT binary patch literal 43583 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 literal 0 HcmV?d00001 diff --git a/problems/0027.移除元素.md b/problems/0027.移除元素.md index 6c73881e..1ce8fe40 100644 --- a/problems/0027.移除元素.md +++ b/problems/0027.移除元素.md @@ -4,25 +4,50 @@ https://leetcode-cn.com/problems/remove-element/ +> 移除元素想要高效的话,不是很简单! + +# 编号:27. 移除元素 + +给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 + +不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并**原地**修改输入数组。 + +元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 + +示例 1: +给定 nums = [3,2,2,3], val = 3, +函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 +你不需要考虑数组中超出新长度后面的元素。 + +示例 2: +给定 nums = [0,1,2,2,3,0,4,2], val = 2, +函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。 + +**你不需要考虑数组中超出新长度后面的元素。** + # 思路 有的同学可能说了,多余的元素,删掉不就得了。 -**要清楚数组的元素在内存地址中是连续的,数组中的元素是不能删掉的,只能覆盖。** +**要知道数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。** + +数组的基础知识可以看这里[程序员算法面试中,必须掌握的数组理论知识](https://mp.weixin.qq.com/s/X7R55wSENyY62le0Fiawsg)。 # 暴力解法 这个题目暴力的解法就是两层for循环,一个for循环遍历数组元素 ,第二个for循环更新数组。 -如动画所示: +删除过程如下: - + 很明显暴力解法的时间复杂度是O(n^2),这道题目暴力解法在leetcode上是可以过的。 -代码如下: +# 暴力解法C++代码 ``` +// 时间复杂度:O(n^2) +// 空间复杂度:O(1) class Solution { public: int removeElement(vector& nums, int val) { @@ -33,7 +58,7 @@ public: nums[j - 1] = nums[j]; } i--; // 因为下表i以后的数值都向前移动了一位,所以i也向前移动一位 - size--;// 此时数组的大小-1 + size--; // 此时数组的大小-1 } } return size; @@ -44,24 +69,42 @@ public: # 双指针法 -双指针法(快慢指针法): **说白了就是通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。** +双指针法(快慢指针法): **通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。** -先看一下动画理解一下: +删除过程如下: + - +**双指针法(快慢指针法)在数组和链表的操作中是非常常见的,很多考察数组和链表操作的面试题,都使用双指针法。** -代码如下: +我们来回顾一下,之前已经讲过有四道题目使用了双指针法。 + +双指针法将时间复杂度O(n^2)的解法优化为 O(n)的解法。也就是降一个数量级,题目如下: + +* [15.三数之和](https://mp.weixin.qq.com/s/r5cgZFu0tv4grBAexdcd8A) +* [18.四数之和](https://mp.weixin.qq.com/s/nQrcco8AZJV1pAOVjeIU_g) + +双指针来记录前后指针实现链表反转: + +* [206.反转链表](https://mp.weixin.qq.com/s/pnvVP-0ZM7epB8y3w_Njwg) + +使用双指针来确定有环: + +* [142题.环形链表II](https://mp.weixin.qq.com/s/_QVP3IkRZWx9zIpQRgajzA) + +双指针法在数组和链表中还有很多应用,后面还会介绍到。 + +# 双指针法C++代码: ``` // 时间复杂度:O(n) // 空间复杂度:O(1) class Solution { public: int removeElement(vector& nums, int val) { - int slowIndex = 0; // index为 慢指针 - for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) { // i 为快指针 - if (val != nums[fastIndex]) { //将快指针对应的数值赋值给慢指针对应的数值 - nums[slowIndex++] = nums[fastIndex]; 注意这里是slowIndex++ 而不是slowIndex-- + int slowIndex = 0; + for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) { + if (val != nums[fastIndex]) { + nums[slowIndex++] = nums[fastIndex]; } } return slowIndex; @@ -69,62 +112,5 @@ public: }; ``` -其实**双指针法(快慢指针法)在在数组和链表的操作中是非常常见的,很多考察数组和链表操作的面试题,都使用双指针法,可以将时间复杂度O(n^2)的解法优化为 O(n)的解法,例如:** - -* [0015.三数之和](https://github.com/youngyangyang04/leetcode/blob/master/problems/0015.三数之和.md) -* [0018.四数之和](https://github.com/youngyangyang04/leetcode/blob/master/problems/0018.四数之和.md) -* [0026.删除排序数组中的重复项](https://github.com/youngyangyang04/leetcode/blob/master/problems/0026.删除排序数组中的重复项.md) -* [0206.翻转链表](https://github.com/youngyangyang04/leetcode/blob/master/problems/0206.翻转链表.md) -* [0344.反转字符串](https://github.com/youngyangyang04/leetcode/blob/master/problems/0344.反转字符串.md) -* [剑指Offer05.替换空格](https://github.com/youngyangyang04/leetcode/blob/master/problems/剑指Offer05.替换空格.md) - -**还有链表找环,也用到双指针:** - -* [0142.环形链表II](https://github.com/youngyangyang04/leetcode/blob/master/problems/0142.环形链表II.md) - -大家都可以去做一做,感受一下双指针法的内在逻辑! - -# 本题C++代码 -## 暴力解法 - -时间复杂度:O(n^2) -空间复杂度:O(1) -``` -class Solution { -public: - int removeElement(vector& nums, int val) { - int size = nums.size(); - for (int i = 0; i < size; i++) { - if (nums[i] == val) { // 发现需要移除的元素,就将数组集体向前移动一位 - for (int j = i + 1; j < size; j++) { - nums[j - 1] = nums[j]; - } - i--; // 因为下表i以后的数值都向前移动了一位,所以i也向前移动一位 - size--;// 此时数组的大小-1 - } - } - return size; - - } -}; -``` - -## 双指针解法 -时间复杂度:O(n) -空间复杂度:O(1) -``` -class Solution { -public: - int removeElement(vector& nums, int val) { - int slowIndex = 0; // index为 慢指针 - for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) { // i 为快指针 - if (val != nums[fastIndex]) { //将快指针对应的数值赋值给慢指针对应的数值 - nums[slowIndex++] = nums[fastIndex]; 注意这里是slowIndex++ 而不是slowIndex-- - } - } - return slowIndex; - } -}; -``` -> 更过算法干货文章持续更新,可以微信搜索「代码随想录」第一时间围观,关注后,回复「Java」「C++」 「python」「简历模板」「数据结构与算法」等等,就可以获得我多年整理的学习资料。 +> 更多算法干货文章持续更新,可以微信搜索「代码随想录」第一时间围观,关注后,回复「Java」「C++」 「python」「简历模板」「数据结构与算法」等等,就可以获得我多年整理的学习资料。 diff --git a/problems/0332.重新安排行程.md b/problems/0332.重新安排行程.md new file mode 100644 index 00000000..ab2a9ee2 --- /dev/null +++ b/problems/0332.重新安排行程.md @@ -0,0 +1,124 @@ + +## 题目地址 + + + +# 第242题.有效的字母异位词 + +# 思路 + +举一个有重复机场的例子: + + + +为什么要举这个例子呢,就是告诉大家,出发机场和到达机场也会重复的,**如果在解题的过程中没有对集合元素处理好,就会死循环。** + +这道题目有几个难点: + +1. 有多种解法,字母序靠前排在前面,让很多同学望而退步,如何该记录映射关系呢 ? +2. 这是一个图不是一棵树,使用深搜/回溯 终止条件是什么呢? +3. 回溯的过程中,如何遍历一个城市所对应的所有城市。 + +首先这道题目是使用回溯法(也可以说深搜),那么按照我总结的回溯模板来。 + +``` +backtracking() { + if (终止条件) { + 存放结果; + } + + for (枚举同一个位置的所有可能性,可以想成节点孩子的数量) { + 递归,处理节点; + backtracking(); + 回溯,撤销处理结果 + } +} +``` + +## 1. 有多种解法,字母序靠前排在前面,让很多同学望而退步,如何该记录映射关系呢 ? + +一个城市映射多个城市,城市之间要靠字母序排列,一个城市映射多个城市,可以使用std::unordered_map,如果让多个城市之间再有顺序的话,就是用std::map 或者 或者std::multimap 或者 std::multiset。 + +如果对map 和 set 的实现机制不太了解,也不清楚为什么 map、multimap就是有序的同学,可以看这篇文章[关于哈希表,你该了解这些!](https://mp.weixin.qq.com/s/g8N6WmoQmsCUw3_BaWxHZA)。 + +这样存放映射关系可以定义为 `unordered_map> targets` 或者 `unordered_map> targets`。 + +含义如下: + +`unordered_map> targets`:`unordered_map<出发城市, 到达城市的集合> targets` +`unordered_map> targets`:`unordered_map<出发城市, map<到达城市, 航班次数>> targets` + +这两个结构,我们选择了后者,因为如果使用`unordered_map> targets` 遍历multiset的时候,不能删除元素,一旦删除元素,迭代器就失效了。而本地在回溯的过程中就是要不断的增删 multiset里的元素,所以 我们使用`unordered_map> targets`。 + +在遍历 `unordered_map<出发城市, map<到达城市, 航班次数>> targets`的过程中,可以使用航班次数这个字段的数字 --或者++,来标记到达城市是否使用过了,而不用对集合做删除元素或者增加元素的操作。 + +## 2. 这是一个图不是一棵树,使用深搜/回溯 终止条件是什么呢? + +你看有多少个航班,那题目中的示例为例,输入: [["MUC", "LHR"], ["JFK", "MUC"], ["SFO", "SJC"], ["LHR", "SFO"]] ,这是有4个航班,那么只要找出一种行程,行程里的机场个数是5就可以了。 + +所以终止条件 我们回溯遍历的过程中,遇到的机场个数,如果达到了(航班数量+1),那么我们就找到了一个行程,把所有航班串在一起了。 + +## 3. 回溯的过程中,如何遍历一个城市所对应的所有城市。 + +这里刚刚说过,在选择映射函数的时候,不能选择`unordered_map> targets`, 因为一旦有元素增删multiset的迭代器就会失效,有一些题解使用了 例如list的迭代器,使用splice来保证 迭代器不失效。 + +可以说既要找到一个对数据经行排序的容器,而且这个容易增删元素,迭代器还不能失效。 + +**再说一下为什么一定要增删元素呢,正如开篇我给出的图中所示,出发机场和到达机场是会重复的,搜索的过程没及时删除元素就会死循环。** + +所以我选择了`unordered_map> targets` 来基于映射条件。 + +遍历过程如下: + +``` + for (pair& target : targets[result[result.size() - 1]]) { + if (target.second > 0 ) { + result.push_back(target.first); + target.second--; + if (backtracking(ticketNum, index + 1, result)) return true; + result.pop_back(); + target.second++; + } + } +``` + +可以看出 通过`unordered_map> targets`里的int字段来判断 这个集合使用使用完了,这样避免了 增删元素。 + +此时完整代码如下: + +# C++代码 + +``` + +class Solution { +private: +// unordered_map<出发城市, map<到达城市, 航班次数>> targets +unordered_map> targets; +bool backtracking(int ticketNum, int index, vector& result) { + if (index == ticketNum + 1) { + return true; + } + for (pair& target : targets[result[result.size() - 1]]) { + if (target.second > 0 ) { // 使用int字段来记录到达城市是否使用过了 + result.push_back(target.first); + target.second--; + if (backtracking(ticketNum, index + 1, result)) return true; + result.pop_back(); + target.second++; + } + } + return false; +} +public: + vector findItinerary(vector>& tickets) { + vector result; + for (const vector& vec : tickets) { + targets[vec[0]][vec[1]]++; // 记录映射关系 + } + result.push_back("JFK"); + backtracking(tickets.size(), 1, result); + return result; + } +}; +``` +