![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Leetcode
一天一道Leetcode
劲蜡鸡腿堡
这个作者很懒,什么都没留下…
展开
-
220. Contains Duplicate III
问题传送门问题分析此问题划分为两个问题:1、定义一个大小为k的窗口,其最右端元素与左侧任意元素组合是否能满足diff < t的要求。2、当上一个窗口不存在时,我们需要滑动窗口,此时窗口中的元素发生变化,第一个元素移除,窗口的next元素进入。我们如何利用原有窗口的数据来高效执行,即减少重复计算。代码此代码利用set保存有序顺序的特性,来保证每次增加和删除时窗口内部的数据有序,且增加和删除时时间复杂度为logk(具体参考红黑树)。通过此例我们可以知道当我们想要维护一个时常进行增加删除的有序集原创 2020-09-02 21:08:57 · 142 阅读 · 0 评论 -
987. Vertical Order Traversal of a Binary Tree
问题传送门解题思路常规树的遍历顺序只有四种,这里题目要求的遍历顺序全都不符合这些遍历要求。所以我们必须通过全部遍历完再整理这种思路去解决问题。遍历过程中我们记录每个节点的[x, y, val],然后不难发现对于全部节点,这就是一个custom sort问题,这里我们还可以利用tuple支持compare,来减少代码工作。代码class Solution {public: void traveNode(TreeNode* root,int x, int y, vector<tuple原创 2020-08-07 21:05:17 · 101 阅读 · 0 评论 -
43. Multiply Strings
问题传送门解决思路这个代码实现的思路就是简单的小学加减法:999 * 999 = 999 * 9 + 999 * 90 + 999 * 900 = 999 * 9 + 999 * 9 * 10 + 999 * 9 * 100。从中我们可以看出,乘法问题拆分成了两个子问题:1、大数与一位数的乘法问题2、大数之间的加法代码class Solution {public: string addtion(string num1, string num2) { if(num1.原创 2020-08-05 21:38:59 · 112 阅读 · 0 评论 -
342. Power of Four
问题传送门解决思路4的n次幂等价于(1 << 2 * n),所以其判断准则就变成了:1、其二进制表示只能且必须存在唯一的一位为1,其余bit为0(num & (num - 1)) == 02、其1bit,位于的位置为 2 * nnum & 0x55555555代码class Solution {public: // power of four = power of two, with the set bit appearing at an odd pos原创 2020-08-04 18:45:31 · 101 阅读 · 0 评论 -
316. Remove Duplicate Letters
问题分析将问题转化为递归问题,我们可以获取如下解题思路。从s中选择一个字符c,此字符满足如下条件字符c后面有剩余所有未出现的字符。例如bcab,其中s[0]后面有集合{c、a} = {a、c、b} - {b} 。而s[2] 后面的集合为{b} != {a、c、b} - {a}。c为满足条件1中所有字符最小的情况选择完c之后,我们从c的位置开始截取新字符串subs,其位置为c的位置+1...原创 2020-04-01 00:05:48 · 208 阅读 · 0 评论 -
153. Find Minimum in Rotated Sorted Array
问题传送门问题分析问题的可递归化要求其子问题与父问题一致。我们观察不难得出利用二分查找,可将数组划分为两个类型。一个为按照生序排序好的数组,而另一个为与源问题相同的旋转数组。我们可知其解位于roated数组当中。代码class Solution {public: int binaryFindMin(vector<int>& nums, int l, int ...原创 2020-03-30 21:29:03 · 76 阅读 · 0 评论 -
297. Serialize and Deserialize Binary Tree
问题传送门问题分析我们想要序列化二叉树,可以像Leetcode序列化二叉树那样,存储所有的节点和NULL。我这里采用另一种方式,根据二叉树定义。每一个节点只有一个父节点。所以我们可以将二叉树变为一组pair<int, int>信息,first表示val。second表示父节点的索引。由于单独仅依靠父节点索引无法辨别其是父节点的左孩子还是右孩子。所以我们使用正负索引来对其进行辨别。...原创 2020-03-25 22:24:21 · 85 阅读 · 0 评论 -
Subsets
思路SubSet 问题可以转换为一个递归问题 {first_item , SubSet(N - 1)} U {SubSet(N - 1)}。代码78. Subsetsclass Solution {public: vector<vector<int>> subsets(vector<int>& nums) { vecto...原创 2020-03-24 22:53:02 · 120 阅读 · 0 评论 -
1329. Sort the Matrix Diagonally
分析我们只需要将对角线上的元素放置到vector中进行排序,排序完成在依次放回便可完成此问题。不过这里有一个对角线元素性质,可以让代码更为优美。即如果a(x1, y1) 和 b(x2, y2)位于同一个对角线上,那么x1 - y1 == x2 - y2。代码class Solution {public: void sortOneDia(vector<vector<...原创 2020-03-17 20:53:17 · 101 阅读 · 0 评论 -
452. Minimum Number of Arrows to Burst Balloons
分析代码class Solution {public: int findMinArrowShots(vector<vector<int>>& points) { if(points.empty()) return 0; sort(points.begin(), points.end(), ...原创 2020-03-14 18:56:07 · 78 阅读 · 0 评论 -
234. Palindrome Linked List
问题传送门解决思路举例来说,假设此时链表结构为1-> 2 -> 3 -> 4 -> 5 -> 6。我们可以将其拆分为两个链表1-> 2 -> 3和4 -> 5 -> 6。然后我们反转第二个链表为6 -> 5 -> 4。之后对两个链表进行比较,其时间复杂度O(n),空间复杂度O(1)。代码class Solution {...原创 2020-03-12 18:26:55 · 141 阅读 · 0 评论 -
Weekly Contest 179
1374. Generate a String With Characters That Have Odd Countsclass Solution {public: string generateTheString(int n) { string s; if(n % 2 == 0){ for(int i = 0; i < ...原创 2020-03-08 20:01:33 · 93 阅读 · 0 评论 -
Path Sum
112. Path Sumclass Solution {public: bool isPathSum(TreeNode* root, int sum, int target){ if(root == nullptr) return false; if(root->left == nullptr && roo...原创 2020-03-05 20:48:56 · 85 阅读 · 0 评论 -
62. Unique Paths
分析典型动态规划问题:我们将pahtCount[i][j] 看作到达grid[i][j]的所有可能路径的情况总和数。那么我们可得pathCount[i][j] = pathCount[i - 1][j] + pathCount[i][j - 1]这是因为我们只能从grid[i][j]的上面grid[i - 1][j]或者左面grid[i][j - 1]到达此点。代码class Solu...原创 2020-03-04 18:00:34 · 93 阅读 · 0 评论 -
222. Count Complete Tree Nodes
问题传送门问题分析完全二叉树的节点总数问题,要分为两个步骤。一、计算二叉树层树lev,由此我们可得lev - 1为满二叉树,其节点数为2 ^ (lev - 1) - 1二、计算最后一层的节点数量。代码class Solution {public: int level = 0, leaves = 0; bool over = false; int getlev(...原创 2020-03-03 10:03:12 · 118 阅读 · 0 评论 -
890. Find and Replace Pattern
问题传送门分析我们只用模拟匹配替换过程即可,需要注意的是我们在匹配过程中需要使用两个map,来保证A -> B和B ->A的一致性。代码class Solution {public: vector<string> findAndReplacePattern(vector<string>& words, string pattern) {...原创 2020-03-02 20:30:51 · 81 阅读 · 0 评论 -
919. Complete Binary Tree Inserter
题目传送门问题分析完全二叉树的存储方式,通过这种存储方式我们可以快速找到一个节点的子节点和父节点,并且节省空间代码class CBTInserter {public: vector<TreeNode *> CBT = {NULL}; CBTInserter(TreeNode* root) { levelTraver(root, CBT...原创 2020-03-01 10:09:04 · 148 阅读 · 0 评论 -
207. Course Schedule
问题传送门问题分析典型的有向图,判断是否存在回路问题。这里我使用的是Kaha算法。但是时间复杂度,空间负责度都过高,可以看出这里我存储时间负责和空间复杂度都为O(n^2),其问题在于如果是完全图他没问题,但是针对稀疏图则效率低下。较优答案采用的是DFS的方式,通过从一个节点出发判断是否会再到达已经到达过的节点,来解决问题。后面的代码是我直接从以提交的答案上摘抄的。class Solutio...原创 2020-02-29 20:59:32 · 80 阅读 · 0 评论 -
857. Minimum Cost to Hire K Workers
题目传送门题目分析这个问题思考的几个关键点。假如我们雇佣了K名员工,那么我们计算这K名员工的工资需要进行如下步骤:计算每个员工的每quality需要的wage,即ratio[i] = wage[i] / quality[i]。之后这K名员工的工资为,sum(max_ratio * quality[i])。由上一个计算过程可知,影响K名员工工资总额的因素有两个max_ratio和sum(q...原创 2020-02-28 18:21:54 · 101 阅读 · 0 评论 -
974. Subarray Sums Divisible by K
传送门问题分析这个问题并不是我解出来的,所以直接翻译其解析好了。首先我们计算A的前缀和P。例如A = [4,5,0,-2,-3,1]则其前缀和为P = [0,4,9,9,7,4,5]。之后我们再对前缀和进行取模运算,并记录各个模结果的总数。其结果为C<sub>0</sub> = 2完整代码...原创 2020-02-26 10:22:59 · 148 阅读 · 0 评论 -
76. Minimum Window Substring
问题传送门问题分析此问题为滑动窗口问题,问题的难度在于如何有效地滑动窗口。我这里的策略是使窗口内所有目标字符都位于最右侧。例如S = ADOBECODEBANC,T = ABC。当窗口为ADOBECODEB时我们标记的目标字符应为"A"DOBE"C"ODE"B",而不是"A"DO"B"E"C"ODEB。窗口继续右滑时,窗口变成了 ADOBECODEBA,此时窗口两边两个字符相同,我们...原创 2020-02-25 09:04:53 · 92 阅读 · 0 评论 -
397. Integer Replacement
问题传送门问题分析典型的遍历解集树问题,但是题目中存在一个特殊数据,他第一次输入的n == INT32_MAX,这将会导致对于n + 1的情况发生溢出问题,所以我们必须指定递归函数的参数为unsigned int。完整代码class Solution {public: int integerReplacement(int n) { return traverse(...原创 2020-02-24 11:20:04 · 127 阅读 · 0 评论 -
400. Nth Digit
问题分析我们查找数位的方式是首先确定是第几个数字n,然后是确定n的第几位。有一般规律可得,1位数字的个数为10 - 1个数字,其所占数位为(10 - 1) * 12位数字的个数为100 - 10个数字,所占数位为(100 - 10) * 10。以此类推,我们可以利用这种方式快速确定数n。完整代码class Solution {public: int nthDigitInNu...原创 2020-02-24 10:39:22 · 66 阅读 · 0 评论 -
672. Bulb Switcher II
问题传送门问题分析TODOing完整代码class Solution {public: void function(string &str, int begin, int step){ for(int i = begin; i < str.size(); i+=step){ if(str[i] == '1') ...原创 2020-02-23 10:28:47 · 175 阅读 · 0 评论 -
114. Flatten Binary Tree to Linked List
问题传送门分析由这个代码我们可以看到如何实现先序遍历的逆序访问源代码class Solution {public: void flatten(TreeNode* root) { if(!root) return; flatten(root->right); flatten(root->left); roo...原创 2020-02-22 16:27:53 · 77 阅读 · 0 评论 -
打印Leetcode二叉树
介绍这个代码能够打印Leetcode中以字符串形式显示的二叉树,方便以直观的形式查看树的结构代码#include <iostream>#include <vector>#include <queue>#include <cmath>using namespace std;/* * 此类用于将leetcode中string形式输出的...原创 2020-02-22 16:20:46 · 393 阅读 · 0 评论 -
228. Summary Ranges
传送门问题分析利用两个指针begin和end来指向nums中的一段连续数字,如果在end移动的过程中依然能够保持其连续性则继续移动end,否则我们直接打印出上一段连续数字的总结,并将begin = end代码class Solution {public: string summaryContinue(int begin, int end){ if(begin =...原创 2020-02-21 09:08:43 · 88 阅读 · 0 评论 -
904. Fruit Into Baskets
传送门问题分析本问题重点在优化从何处再次搜索tree,这里我使用lastLoc用于记录不同类型最后一次出现的位置下标。那么我们再次搜索时只用从min(lastLoc[0], lastLoc[1]) + 1 出发就可以了,这样可以从一定程度上加速搜索速度。源码class Solution {public: int totalFruit(vector<int>&...原创 2020-02-20 20:08:47 · 137 阅读 · 0 评论 -
778. Swim in Rising Water
题目传送门思路分析这里我使用了最简单的广度优先遍历方法去解决问题,与一般问题不同的是我们需要维护一个waterElevation表示当前的水面高度。如果我们所有的已搜索的方块高度均高于水平面,我们只有将水平面升高才能接着进行下一步的广度搜索。这一步就是用于拉高水平面的。 if(minHeap.front()[0] > waterElevation){ waterElevat...原创 2020-02-20 17:11:53 · 97 阅读 · 0 评论 -
371. Sum of Two Integers
题目传送门题目分析Basically here is the intuitive explanation:a ^ b we know gives us sum value WITH ALL DIGITS ADDED without carry: 0 ^ 0 = 0 , 1 ^ 0 = 1, 0 ^ 1 = 1, 1 ^ 1 = 0, this is what the sum of eac...原创 2020-01-21 17:46:32 · 105 阅读 · 0 评论 -
655. Print Binary Tree
问题传送门问题分析这个问题其实逻辑特别简单,就是找到应该打印的位置,然后打印上去就可以了。我这里直接使用递归的方式进行,保证了代码的整洁。按照题目要求高度至多10层,所以也不用考虑太多的效率问题。代码class Solution {public: int treeHeight(TreeNode *root){ if(root == NULL) ...原创 2020-01-19 19:53:09 · 116 阅读 · 0 评论 -
1282. Group the People Given the Group Size They Belong To
题目传送门问题分析按照问题描述,我们可以得出如下结论。假设一个人声明自己所属的组的数目为3,那么我们将groupSize中的3全部放在一起,其数目一定是3的倍数,并且我们只要从这些数字中依次取3个便可以构成一个合法的组。其中算法中利用了hashmap结构,用于映射元素,保证在线性时间内找到相应的元素。代码class Solution {public: vector<ve...原创 2020-01-19 10:29:01 · 218 阅读 · 0 评论 -
934. Shortest Bridge
题目传送门题目分析这个题目其实可以简化为三个步骤1、找到第一个岛的边2、从第一个岛的边开始进行广度优先遍历3、广度优先遍历到出现第二关岛时停止。为实现这个算法,我们需要解决如下问题:如何找到小岛的边、如何区分我们出发的岛和我们要找到的岛源代码代码写得太丑,凑活看吧。class Solution{public: void genBorder(vector<vect...原创 2020-01-18 15:50:45 · 177 阅读 · 0 评论 -
915. Partition Array into Disjoint Intervals
题目传送门题目分析这个题目中我们需要维护leftmax,当我们的leftmax比剩余数组元素都小是我们就可以将我们的断点进行返回了,但如果我们搜寻过程中遇到了更小的点,则将此点更新为新的断点。由于更新断点的过程中需要重置leftmax,所以我们会记录下向右试探过程中的最大值,这个思路的最后结果就是第一个算法。题主分享了一个答案,思路更为清晰,他记录下了A[:i]的最大值和A[i:]的最小值,...原创 2020-01-17 18:57:21 · 89 阅读 · 0 评论 -
139. Word Break
题目传送门题目分析我们先来总结下,递归方程的抽象含义。设A[1:N]表示计算字符串s的1至N位是否可以由字段组成。那么 A[1:N]可以通过A[1:1] && A[2:N], A[1:2] && [2:N] … A[1:N-1] && A[N:N]计算。那么递归表达式就计算出来了,其中这个递归表达式也符合动态规划的遍历顺序,所以这道题目也...原创 2020-01-16 16:39:30 · 91 阅读 · 0 评论 -
1267. Count Servers that Communicate
题目传送门分析没啥分析的,就是第一次遍历标记哪行有电脑,哪列有电脑。然后在标记完成之后,我们只需要对齐再进行判断就行。在第一次遍历时我们可以记录下每台电脑的位置,这样我们就不必再遍历整个grid。这个记录操作过程我们可以优化,当我们已经明确知道其可以通信时,我们只需要count++,而不必保存其位置。代码class Solution {public: int countSer...原创 2020-01-15 11:09:26 · 162 阅读 · 0 评论 -
420. Strong Password Checker
题目传送门题目分析我必须承认这道题目非常恶心,其被称为hard题并不在于他使用了什么特别难想到的方法,而是在于整个程序逻辑思路的整体,你需要考虑特别多的情况,并且按照处理流程整理出来。我这里提出几个需要注意的点:1:replace操作永远都是最高效的操作,在字符长度符合要求的情况下,你可以只使用replace而不必在考虑insertion和deletetion。2:insertion和d...原创 2020-01-14 11:40:17 · 195 阅读 · 0 评论 -
450. Delete Node in a BST
问题传送门分析数据结构上的问题,我们需要找到删除节点的前一个节点、或者后一个节点来替换删除节点。前一个节点按照BST(binary sorted tree)性质为左子树最右侧节点。后一个节点为右子树最左侧节点。我们直接使用值覆盖的方式替换,替换完成后,我们需要删除替换节点。替换节点有一性质,他必定是单支树,所以我们只用将其子树(左子树、右子树)链接至父节点就可以了。代码 clas...原创 2020-01-13 12:53:19 · 96 阅读 · 0 评论 -
673. Number of Longest Increasing Subsequence
问题传送门问题分析这个就是动态规划的典型问题,我们假设lgst(i)表示以nums[i]结尾的递增序列的最大长度。lgst_num(i)表示nums[i]结尾的最大递增序列的数量。那么我们就能得出如下地推公式:logs(i) = max(logs(i - 1) + 1, logs(i - 1) + 1, logs(i - 2) + 1 ..., logs(0) + 1)logs_n...原创 2020-01-12 11:57:56 · 108 阅读 · 0 评论 -
30. Substring with Concatenation of All Words
题目传送门问题分析TODO代码class Solution {public: vector<int> findSubstring(string s, vector<string>& words) { if(s.size() == 0 || words.size() == 0) return {}; ...原创 2020-01-11 13:27:52 · 185 阅读 · 0 评论