From 3ee636ec90a5a24df96e8faaa278fe0b9e0167f7 Mon Sep 17 00:00:00 2001 From: youngyangyang04 <826123027@qq.com> Date: Fri, 21 Aug 2020 10:31:54 +0800 Subject: [PATCH] Update --- README.md | 5 +++ pics/90_子集 II.png | Bin 0 -> 44641 bytes problems/0001.两数之和.md | 62 +++++++++++++++++++++++--- problems/0039.组合总和.md | 66 +++++++++++++++++++++++++++ problems/0040.组合总和II.md | 74 +++++++++++++++++++++++++++++++ problems/0077.组合.md | 46 +++++++++++++++++++ problems/0078.子集.md | 49 ++++++++++++++++++++ problems/0090.子集II.md | 38 ++++++++++++++++ problems/0216.组合总和III.md | 56 +++++++++++++++++++++++ 9 files changed, 390 insertions(+), 6 deletions(-) create mode 100644 pics/90_子集 II.png create mode 100644 problems/0039.组合总和.md create mode 100644 problems/0040.组合总和II.md create mode 100644 problems/0077.组合.md create mode 100644 problems/0078.子集.md create mode 100644 problems/0090.子集II.md create mode 100644 problems/0216.组合总和III.md diff --git a/README.md b/README.md index efb9572b..b93b9bb1 100644 --- a/README.md +++ b/README.md @@ -349,10 +349,14 @@ int countNodes(TreeNode* root) { |[0027.移除元素](https://github.com/youngyangyang04/leetcode/blob/master/problems/0027.移除元素.md) |数组 |简单| **暴力** **双指针/快慢指针/双指针**| |[0028.实现strStr()](https://github.com/youngyangyang04/leetcode/blob/master/problems/0028.实现strStr().md) |字符串 |简单| **KMP** | |[0035.搜索插入位置](https://github.com/youngyangyang04/leetcode/blob/master/problems/0035.搜索插入位置.md) |数组 |简单| **暴力** **二分**| +|[0039.组合总和](https://github.com/youngyangyang04/leetcode/blob/master/problems/0039.组合总和.md) |数组/回溯 |中等| **回溯**| +|[0040.组合总和II](https://github.com/youngyangyang04/leetcode/blob/master/problems/0040.组合总和II.md) |数组/回溯 |中等| **回溯**| |[0046.全排列](https://github.com/youngyangyang04/leetcode/blob/master/problems/0046.全排列.md) |回溯|中等| **回溯**| |[0047.全排列II](https://github.com/youngyangyang04/leetcode/blob/master/problems/0047.全排列II.md) |回溯|中等| **回溯**| |[0053.最大子序和](https://github.com/youngyangyang04/leetcode/blob/master/problems/0053.最大子序和.md) |数组 |简单|**暴力** **贪心** 动态规划 分治| |[0059.螺旋矩阵II](https://github.com/youngyangyang04/leetcode/blob/master/problems/0059.螺旋矩阵II.md) |数组 |中等|**模拟**| +|[0077.组合](https://github.com/youngyangyang04/leetcode/blob/master/problems/0077.组合.md) |回溯 |中等|**回溯**| +|[0078.子集](https://github.com/youngyangyang04/leetcode/blob/master/problems/0078.子集.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) |树 |中等|**递归** **迭代/栈**| @@ -375,6 +379,7 @@ int countNodes(TreeNode* root) { |[0205.同构字符串](https://github.com/youngyangyang04/leetcode/blob/master/problems/0205.同构字符串.md) |哈希表 |简单| **哈希**| |[0206.翻转链表](https://github.com/youngyangyang04/leetcode/blob/master/problems/0206.翻转链表.md) |链表 |简单| **双指针法** **递归**| |[0209.长度最小的子数组](https://github.com/youngyangyang04/leetcode/blob/master/problems/0209.长度最小的子数组.md) |数组 |中等| **暴力** **滑动窗口**| +|[0216.组合总和III](https://github.com/youngyangyang04/leetcode/blob/master/problems/0216.组合总和III.md) |数组/回溯 |中等| **回溯**| |[0219.存在重复元素II](https://github.com/youngyangyang04/leetcode/blob/master/problems/0219.存在重复元素II.md) | 哈希表 |简单| **哈希** | |[0222.完全二叉树的节点个数](https://github.com/youngyangyang04/leetcode/blob/master/problems/0222.完全二叉树的节点个数.md) | 树 |简单| **递归** | |[0225.用队列实现栈](https://github.com/youngyangyang04/leetcode/blob/master/problems/0225.用队列实现栈.md) | 队列 |简单| **队列** | diff --git a/pics/90_子集 II.png b/pics/90_子集 II.png new file mode 100644 index 0000000000000000000000000000000000000000..8c773a1709d2227d098f5ca22a99be0626607e37 GIT binary patch literal 44641 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 z
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 T;>sfa0)LunI;thg*7yDoIRM0! literal 0 HcmV?d00001 diff --git a/problems/0001.两数之和.md b/problems/0001.两数之和.md index e62fd846..624cd6bc 100644 --- a/problems/0001.两数之和.md +++ b/problems/0001.两数之和.md @@ -1,17 +1,67 @@ -## 题目地址 +# 题目地址 https://leetcode-cn.com/problems/two-sum/ -## 思路 +> 只用数组和set还是不够的! + +# 第1题. 两数之和 + +给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 + +你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 + +**示例:** + +给定 nums = [2, 7, 11, 15], target = 9 + +因为 nums[0] + nums[1] = 2 + 7 = 9 + +所以返回 [0, 1] + + +# 思路 很明显暴力的解法是两层for循环查找,时间复杂度是O(n^2)。 -我们来看一下使用数组和set来做哈希法的局限。 + +使用哈希法最为合适,之前已经介绍过,数组和set在哈希法中的应用,那么来看一下使用数组和set来做哈希法的局限。 * 数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。 -* set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判断y是否存在而且还要记录y的下表位置,因为我们要返回x 和 y的下表。所以set 也不能用。 +* set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判断y是否存在而且还要记录y的下表位置,因为要返回x 和 y的下表。所以set 也不能用。 -此时我们就要选择一种数据结构 map ,map是一种key value的存储结构,我们可以用key保存数值,用value在保存数值所在的下表。 -这道题目是map在哈希法中的经典应用 +此时就要选择另一种数据结构:map ,map是一种key value的存储结构,可以用key保存数值,用value在保存数值所在的下表。 +C++中map,有三种类型: + +|映射 |底层实现 | 是否有序 |数值是否可以重复 | 能否更改数值|查询效率 |增删效率| +|---|---| --- |---| --- | --- | ---| +|std::map |红黑树 |key有序 |key不可重复 |key不可修改 | O(logn)|O(logn) | +|std::multimap | 红黑树|key有序 | key可重复 | key不可修改|O(logn) |O(logn) | +|std::unordered_map |哈希表 | key无序 |key不可重复 |key不可修改 |O(1) | O(1)| + +std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底层实现是红黑树。 + +同理,std::map 和std::multimap 的key也是有序的(这个问题也经常作为面试题,考察对语言容器底层的理解)。 更多哈希表的理论知识请看[关于哈希表,你该了解这些!](https://mp.weixin.qq.com/s/g8N6WmoQmsCUw3_BaWxHZA)。 + +**这道题目中并不需要key有序,选择std::unordered_map 效率更高!** + +# C++代码 + +``` +class Solution { +public: + vector twoSum(vector& nums, int target) { + std::unordered_map map; + for(int i = 0; i < nums.size(); i++) { + auto iter = map.find(target - nums[i]); + if(iter != map.end()) { + return {iter->second, i}; + break; + } + map.insert(nums[i], i); + } + return {}; + } +}; +``` ## 一般解法 diff --git a/problems/0039.组合总和.md b/problems/0039.组合总和.md new file mode 100644 index 00000000..ec89c132 --- /dev/null +++ b/problems/0039.组合总和.md @@ -0,0 +1,66 @@ +# 第39题. 组合总和 + +给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 + +candidates 中的数字可以无限制重复被选取。 + +**说明:** + +所有数字(包括 target)都是正整数。 +解集不能包含重复的组合。  + +示例 1: + +输入:candidates = [2,3,6,7], target = 7, +所求解集为: +[ + [7], + [2,2,3] +] + +示例 2: + +输入:candidates = [2,3,5], target = 8, +所求解集为: +[ +  [2,2,2,2], +  [2,3,3], +  [3,5] +] + +# 思路 + +# C++代码 + +``` +// 无限制重复被选取。 吓得我赶紧想想 0 可咋办 +class Solution { +private: + vector> result; + void backtracking(vector& candidates, int target, vector& vec, int sum, int startIndex) { + if (sum > target) { + return; + } + if (sum == target) { + result.push_back(vec); + return; + } + + // 因为可重复,所以我们从0开始, 这道题目感觉像是47.全排列II,其实不是 + for (int i = startIndex; i < candidates.size(); i++) { + sum += candidates[i]; + vec.push_back(candidates[i]); + backtracking(candidates, target, vec, sum, i); // 关键点在这里,不用i+1了 + sum -= candidates[i]; + vec.pop_back(); + + } + } +public: + vector> combinationSum(vector& candidates, int target) { + vector vec; + backtracking(candidates, target, vec, 0, 0); + return result; + } +}; +``` diff --git a/problems/0040.组合总和II.md b/problems/0040.组合总和II.md new file mode 100644 index 00000000..dfd513b7 --- /dev/null +++ b/problems/0040.组合总和II.md @@ -0,0 +1,74 @@ +# 第40题. 组合总和 +给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 + +candidates 中的每个数字在每个组合中只能使用一次。 + +说明: + +所有数字(包括目标数)都是正整数。 +解集不能包含重复的组合。  + +示例 1: + +输入: candidates = [10,1,2,7,6,1,5], target = 8, +所求解集为: +[ + [1, 7], + [1, 2, 5], + [2, 6], + [1, 1, 6] +] + +示例 2: + +输入: candidates = [2,5,2,1,2], target = 5, +所求解集为: +[ +  [1,2,2], +  [5] +] + +# 思想 + +# C++代码 + +``` +class Solution { +private: + vector> result; + void backtracking(vector& candidates, int target, vector& vec, int sum, int startIndex, vector& used) { + if (sum > target) { + return; + } + if (sum == target) { + result.push_back(vec); + return; + } + +// 每个组合中只能使用一次 所以用 startindex +// 给定一个数组 candidates 默认有重复项,解集不能包含重复的组合。 所以使用if这一套 + for (int i = startIndex; i < candidates.size(); i++) { + if (i > 0 && candidates[i] == candidates[i - 1] && used[i - 1] == false) { + continue; + } + sum += candidates[i]; + vec.push_back(candidates[i]); + used[i] = true; + backtracking(candidates, target, vec, sum, i + 1, used); // 关键点在这里,不用i+1了 + used[i] = false; + sum -= candidates[i]; + vec.pop_back(); + } + } + +public: + vector> combinationSum2(vector& candidates, int target) { + vector vec; + vector used(candidates.size(), false); + sort(candidates.begin(), candidates.end()); + backtracking(candidates, target, vec, 0, 0, used); + return result; + + } +}; +``` diff --git a/problems/0077.组合.md b/problems/0077.组合.md new file mode 100644 index 00000000..09367483 --- /dev/null +++ b/problems/0077.组合.md @@ -0,0 +1,46 @@ +# 第77题. 组合 +给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。 +示例: + +输入: n = 4, k = 2 +输出: +[ + [2,4], + [3,4], + [2,3], + [1,2], + [1,3], + [1,4], +] + +# 思路 + + +# C++ 代码 + +``` +class Solution { +private: + vector> result; + void backtracking(int n, int k, vector& vec, int startIndex) { + if (vec.size() == k) { + result.push_back(vec); + return; + } + // 这个for循环有讲究,组合的时候 要用startIndex,排列的时候就要从0开始 + // 这个过程好难理解,需要画图 + for (int i = startIndex; i <= n; i++) { + vec.push_back(i); + backtracking(n, k, vec, i + 1); + vec.pop_back(); + } + } +public: + + vector> combine(int n, int k) { + vector vec; + backtracking(n, k, vec, 1); + return result; + } +}; +``` diff --git a/problems/0078.子集.md b/problems/0078.子集.md new file mode 100644 index 00000000..ee84f70d --- /dev/null +++ b/problems/0078.子集.md @@ -0,0 +1,49 @@ +# 题目地址 + +# 第78题. 子集 +给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。 + +说明:解集不能包含重复的子集。 + +示例: + +输入: nums = [1,2,3] +输出: +[ + [3], +  [1], +  [2], +  [1,2,3], +  [1,3], +  [2,3], +  [1,2], +  [] +] + + +# 思路 + + +# C++代码 + +``` + +class Solution { +private: + void backtracking(vector& nums, vector>& result, vector& vec, int startIndex) { + result.push_back(vec); + for (int i = startIndex; i < nums.size(); i++) { + vec.push_back(nums[i]); + backtracking(nums, result, vec, i + 1); + vec.pop_back(); + } + } +public: + vector> subsets(vector& nums) { + vector> result; + vector vec; + backtracking(nums, result, vec, 0); + return result; + } +}; +``` diff --git a/problems/0090.子集II.md b/problems/0090.子集II.md new file mode 100644 index 00000000..6e516536 --- /dev/null +++ b/problems/0090.子集II.md @@ -0,0 +1,38 @@ +# 题目地址 +https://leetcode-cn.com/problems/subsets-ii/ +# 第90题. 子集II + + +# 思路 + + +# C++代码 + +``` +class Solution { +private: + void backtracking(vector& nums, vector>& result, vector& vec, int startIndex, vector& used) { + result.push_back(vec); + for (int i = startIndex; i < nums.size(); i++) { + if (i > 0 && nums[i] == nums[i - 1] && used[i-1] == false) { // 果然去重都是一个逻辑啊 + continue; + } + vec.push_back(nums[i]); + used[i] = true; + backtracking(nums, result, vec, i + 1, used); + used[i] = false; + vec.pop_back(); + } + } + +public: + vector> subsetsWithDup(vector& nums) { + vector used(nums.size(), false); + vector> result; + vector vec; + sort(nums.begin(), nums.end()); + backtracking(nums, result, vec, 0, used); + return result; + } +}; +``` diff --git a/problems/0216.组合总和III.md b/problems/0216.组合总和III.md new file mode 100644 index 00000000..2cdf5dfe --- /dev/null +++ b/problems/0216.组合总和III.md @@ -0,0 +1,56 @@ +# 第216题. 组合总和 III +找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。 + +说明: + +所有数字都是正整数。 +解集不能包含重复的组合。  + +示例 1: + +输入: k = 3, n = 7 +输出: [[1,2,4]] +示例 2: + +输入: k = 3, n = 9 +输出: [[1,2,6], [1,3,5], [2,3,4]] + + +# 思路 + + +# C++代码 + +``` +class Solution { +private: + vector> result; + void backtracking(int target, int k, vector& vec, int num, int sum, int startIndex) { + if (sum > target || num > k) { + return; + } + if (num == k && sum == target) { + result.push_back(vec); + return; + } + + for (int i = startIndex; i <= 9; i++) { + sum += i; + vec.push_back(i); + num++; + backtracking(target, k, vec, num, sum, i + 1); + num--; + sum -= i; + vec.pop_back(); + } + } + +public: + vector> combinationSum3(int k, int n) { + vector vec; + backtracking(n, k, vec, 0, 0, 1); + return result; + + } +}; +```