- 博客(54)
- 收藏
- 关注
原创 142. Linked List Cycle II
142. 环形链表 II题目描述给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。思路方法一:哈希表直接把节点指针记录在哈希表里,每次查表,有重复就是环。class Solution {public: ListNode *detectCycle(ListNode *head) { unordered_set<ListNode *> visited; while (head != nullptr) {
2021-02-01 20:42:58
95
原创 59. Spiral Matrix II
59. 螺旋矩阵 II题目描述给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。思路画出了1~5的情况,找规律。改进-最快代码class Solution {public: vector<vector<int>> generateMatrix(int n) { vector<vector<int>> res(n, vector<int>(n, 0)); //
2021-02-01 20:42:21
179
原创 112. Path Sum
112. 路径总和题目描述从根节点到叶子节点,加起来能不能满足targetsum。思路这个题目一开始没看明白,以为是只要有路径就行,没想到是结尾得是叶子节点,用广搜做的…改进递归的方法。class Solution {public: bool hasPathSum(TreeNode* root, int sum) { if (!root) return false; if (!root->left && !root->ri
2021-01-28 12:00:00
109
原创 111. Minimum Depth of Binary Tree
111. 二叉树的最小深度题目描述求二叉树最小深度,也就是从根节点到最近叶子节点的最短路径上的节点数量。思路层序遍历二叉树,记录最小深度。改进最快的做法使用了一个map记录节点和自己的深度。class Solution {public: int minDepth(TreeNode *root) { if (root == nullptr) { return 0; } queue<pair<Tre
2021-01-27 16:54:27
72
原创 199. Binary Tree Right Side View
199. 二叉树的右视图题目描述给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。思路类似于二叉树层序遍历,锯齿形遍历,只是每次都保存最右一个。改进时间最快的方案,用了一个map,一个节点栈,一个深度栈,一个最大深度记录,甚至没有用emplace。class Solution {public: vector<int> rightSideView(TreeNode* root) { unordered_map<
2021-01-26 19:18:14
93
原创 105. Construct Binary Tree from Preorder and Inorder Traversal
105. 从前序与中序遍历序列构造二叉树题目描述从前序与中序遍历序列构造二叉树,可以假设树中没有重复的元素。思路递归,根据前序找到根节点,根据中序划分左子树右子树,再构造子树。改进官方解法为递归和迭代。最快的代码:class Solution {public: TreeNode* buildSubtree(vector<int>& preorder, int pl, int pr, vecto
2021-01-26 14:01:40
53
原创 103. Binary Tree Zigzag Level Order Traversal
103. 二叉树的锯齿形层序遍历题目描述层序遍历二叉树,但是相邻的层顺序不一样,从左向右,从右向左,依次遍历。思路还是广度优先遍历,每次插入单层的答案的时候,双数层改insert往前插。代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(
2021-01-26 14:00:59
67
原创 102. Binary Tree Level Order Traversal
102. 二叉树的层序遍历题目描述对二叉树层序遍历,返回二维数组。思路广度优先遍历代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solut
2021-01-26 14:00:07
58
原创 98. Validate Binary Search Tree
98. 验证二叉搜索树题目描述验证一棵树是不是二叉搜索树思路递归,这里到底谁大谁小说实话绕了半天。。。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNo
2021-01-26 13:59:42
52
原创 94. Binary Tree Inorder Traversal
二叉树的中序遍历题目描述中序遍历思路递归题目还说递归太简单啦,你再用个迭代吧。代码递归/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(
2021-01-20 10:11:14
49
原创 19. Remove Nth Node From End of List
19. 删除链表的倒数第N个节点题目描述删除链表的倒数第N个节点思路双指针,相差n,遍历,当快的那个到链表尾的时候,慢的那个刚好指的是要删除的那个节点。代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) :
2021-01-20 10:10:33
52
原创 1332.remove-palindromic-subsequences
1332. 删除回文子序列题目描述字符串s仅由a和b构成,每一次删除操作可以从s中删除一个回文子串,问删空需要删除几次?官方思路这是一道脑筋急转弯题目。。。由于只有 a 和 b 两个字符。其实最多的消除次数就是 2。因为我们无论如何都可以先消除全部的 1 再消除全部的 2(先消除 2 也一样),这样只需要两次即可完成。代码class Solution {public: int removePalindromeSub(string s) { if(s == "")
2021-01-17 15:44:45
169
原创 1260.shift-2d-grid
1260. 二维网格迁移题目描述m行n列网格,挨个移动k次,末位的再提到最前。思路把二维展开成一维,移动着填回来。代码class Solution {public: vector<vector<int>> shiftGrid(vector<vector<int>>& grid, int k) { vector<int> vp; for (size_t i = 0; i < grid
2021-01-17 15:44:05
105
原创 874.walking-robot-simulation
874. 模拟行走机器人题目描述模拟机器人行走,默认向北,-1左转90度,-2右转90度,1-9表示前进。另有表示障碍的二维数组,遇到障碍往障碍后退一格。求经过的点到原点欧氏距离最大值。思路顺着题目描述暴力解。题目看清!是求最大值!但是超时了。官方思路机器人每试图走一个位置,就用此位置与障碍物集合列表里的坐标进行比较,看是否刚好是障碍物坐标点。必须注意使用 集合 Set 作为对障碍物使用的数据结构,以便我们可以有效地检查下一步是否受阻。如果不这样做,我们检查 该点是障碍点吗 可能会慢大约 10
2021-01-17 11:32:53
124
原创 821.shortest-distance-to-a-character
821. 字符的最短距离题目描述给一个字符串S,一个字符C,给出S中所有字符与字符C的最小距离。思路遍历S,比较每个字符,如果不是C就做一次记录。因为要最小,所以加入有没有遇到过C的记录。代码class Solution {public: vector<int> shortestToChar(string S, char C) { vector <int> res(S.size(), 10001); int le
2021-01-16 21:05:38
59
原创 575.distribute-candies
575. 分糖果题目描述偶数个数的数组,数字代表糖果种类,弟弟妹妹平均分,妹妹做多能分到多少种类的糖果?思路妹妹能获得的,要么是糖果种类数,要么是n/2。官方其实就是求糖果种类数。用set就可以。代码class Solution {public: int distributeCandies(vector<int>& candyType) { int num = candyType.size()/2;//妹妹可以分得的糖果个数 m
2021-01-16 21:05:03
91
原创 455.AssignCookies
455. 分发饼干题目描述一个数组里int值是孩子的胃口,另一个数组里int值是饼干的尺寸,求饼干可以满足几个孩子?思路大不了就是遍历呗对两个数组都进行排序,排序以后从大到小双指针指向俩数组,一一对应比较大小。如果饼干不够大,那这个孩子就满足不了,咱们看看下一个孩子的需求就好。官方思路贪心算法,先排序再贪心。代码class Solution {public: int findContentChildren(vector<int>& g, vector<i
2021-01-16 21:04:22
60
原创 401.binary-watch
401. Binary Watch题目描述4位二进制表示小时,6位二进制表示分钟。输入num,输出num个1可以表示哪些时间?思路硬件做法:查表法。发现,其实不需要完整的表,几个1的数值都是由1的那些可能加起来得到的。比如,2个1在小时,[3,5,6,9,10]是由[1,2,4,8]两两加一加得到的。那么做起来只需要分情况讨论即可。事实上操作起来还是比较繁琐的。不如看下解答吧叹气。官方解答方法一:暴力暴力永远是最牛的!!!class Solution {public: ve
2021-01-16 21:03:44
76
原创 160.Intersection-of-Two-Linked-Lists
160. Intersection of Two Linked Lists题目描述两链表相交,找到它们相交的节点并返回其地址。思考数值一样是不够的,就一定要是相交的节点。能不能双指针倒着往前找?——不能。官方解答双指针。【这个算法也浪漫了吧,错的人迟早会走散,而对的人迟早会相逢!】妙!!!A和B两个链表长度可能不同,但是A+B和B+A的长度是相同的,所以遍历A+B和遍历B+A一定是同时结束。 如果A,B相交的话A和B有一段尾巴是相同的,所以两个遍历的指针一定会同时到达交点 如果A,B不相
2021-01-15 13:36:48
93
原创 66.plus-one
66. Plus One题目描述一个非空数组表示一个十进制数,给它加1,返回该数组。思路直接加。还需要考虑进位以后多了一位的情况!!!知识vector 遍历方法vector 插入 v.insert(v.begin(),1)代码class Solution {public: vector<int> plusOne(vector<int>& digits) { int count = digits.size(); bo
2021-01-14 18:03:52
49
原创 binode-lcci
面试题 17.12. BiNode题目描述把二叉搜索树转换为单向链表(左孩子空,右孩子为后继),要求依然符合二叉搜索树的性质。前置知识二叉搜索树: 左子树不空的话,小于根节点;右子树不空的话,大于根节点;左右子树都是二叉搜索树。分析题目的样例输入是二叉搜索树。但是直接转化的话,就不符合大小关系了。如果单链表符合二叉搜索树的话,其实就是要从小到大的排序的。这个问题肯定是递归去做了,递归关系在哪儿呢?官方思路关键点:众所周知,对二叉搜索树采用中序遍历就能得到一个升序序列。所以这个题就是,中序
2021-01-14 18:03:18
101
原创 pandas_profiling 一行生成数据分析报告
import pandas as pdimport pandas_profiling as ppX=pd.read_csv('./X.csv')report = pp.ProfileReport(X)report.to_file('X.html')以及变量之间的相关性之类的东西
2020-10-24 01:39:21
99
原创 371.sum-of-two-integers
371. Sum of Two Integers题目描述不用+和-计算两个数的和。思路本来想着就摁加,遍历然后++这样,但是考虑负数的话就不行了,遍历–。官方解答不能使用加减法来求加法。 我们只能朝着位运算的角度来思考了。由于异或是相同则位0,不同则位1,因此我们可以把异或看成是一种不进位的加减法。由于与是全部位1则位1,否则位0,因此我们可以求与之后左移一位来表示进位。代码class Solution {public: int getSum(int a, int b) {
2020-10-12 16:53:03
71
原创 349.intersection-of-two-arrays
349. Intersection of Two Arrays题目描述找出两个数组的交集集合。思路先把num1中的数记录到map中,再从num2中查找是不是出现了map中的数。代码class Solution {public: vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { map<int,int> m;
2020-10-12 16:52:19
46
原创 342.power-of-four
342. Power of Four题目描述如何检查一个数(32位有符号整数)是否为 4 的幂前置知识数论官方解法题目要求不能用循环或递归方法一:暴力法 + 预计算提前计算所有可能答案。我们知道输入的整数是 32 位整数。 最大4的幂次是[log4(2^31-1)]=15 那么共有16种可能:40,41……4^15预计算全部可能,然后运行时检查输入数字是否在预计算列表中。方法二:数学运算如果数字为4的幂x=4^a,则a=log4x=1/2(log2x)应为整数,那么我们检查lo
2020-10-10 16:05:08
77
原创 283.move-zeroes
283. Move Zeroes题目描述将数组中的0移动到数组末端,其他数保持原来的顺序往前挪思路遍历数组,记录0的位置,0的个数,用非0的数占0的坑。再从右向左遍历按0的个数填0。官方解法双指针最优解最优解的做法是每次都交换0和非0void moveZeroes(vector<int>& nums) { for (int lastNonZeroFoundAt = 0, cur = 0; cur < nums.size(); cur++) {
2020-10-09 11:33:58
57
原创 263.ugly-number
263. Ugly Number题目描述判断一个数是不是质因子全是2、3和5思路用竖除的方式把2和3和5都除掉,最后还剩别的数,说明不是丑数官方解法先循环除以2,3,5。然后判断结果,是1就是丑数,否则就不是。class Solution {public: bool isUgly(int num) { if (num<1) return false; while (num%5==0){ num/=5; }
2020-09-27 15:06:53
46
原创 232.implement-queue-using-stacks
232. Implement Queue using Stacks题目描述用基本栈完成一个队列。思路栈是先进后出,队列是先进先出。所以在需要有元素出队列的时候,用一个辅助栈将原栈翻转,即可。官方解法摊还数据结构中就包含了两个栈,其实不需要每次把辅助栈里的内容倒回去。代码class MyQueue {public: stack<int> stIn; stack<int> stOut; /** Initialize your data stru
2020-09-27 15:06:06
45
原创 226.invert-binary-tree
226. Invert Binary Tree题目描述反转一个二叉树思路递归,只要root有值,就反转左右孩子指针,再对左右子树进行反转二叉树。代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right
2020-09-23 22:19:15
41
原创 219.contains-duplicate-ii
219. Contains Duplicate II题目描述找到数组中重复的数字,绝对距离是不是小于k的思路用hash表记录出现过的数字和下标,出现重复数字的时候下标相减是绝对距离。官方解法竟然和我这解法一样QAQ时间和空间占用的百分比都不是很漂亮,可能因为使用了STL代码class Solution {public: bool containsNearbyDuplicate(vector<int>& nums, int k) { map<
2020-09-22 11:19:09
73
原创 206.reverse-linked-list
206. Reverse Linked List题目描述反转一个单链表思路真正反转节点的做法没有想到。借助栈,反转了链表的数值。官方解法迭代在遍历列表时,将当前节点的 next 指针改为指向前一个元素。由于节点没有引用其上一个节点,因此必须事先存储其前一个元素。在更改引用之前,还需要另一个指针来存储下一个节点。不要忘记在最后返回新的头引用!class Solution {public: ListNode* reverseList(ListNode* head) {
2020-09-21 21:50:43
56
原创 203.remove-linked-list-elements
203. Remove Linked List Elements题目描述去掉一个链表中所有的值为val的节点思路遍历一个一个比对是不是要去掉,最后检查头节点代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solut
2020-09-21 21:50:11
53
原创 198.house-robber
198. House Robber题目描述不相邻的最大和前置知识动态规化官方思路本质上在解决对于第 [i] 个房子,我们抢还是不抢的问题。状态转移方程 dp[i] = Math.max(dp[i - 2] + nums[i - 2], dp[i - 1]);注:这里为了方便计算,令 dp[0]和 dp[1]都等于 0,所以 dp[i]对应的是 nums[i - 2])将空间复杂度优化:只需要用到dp[i-1]和dp[i-2],不用保存所有历史信息。代码class Solution {
2020-09-21 21:01:49
81
原创 a包含b的所有质数因子
题目描述判断a是不是包含b的所有质数因子。思路类似竖除求出b的所有质数因子,顺便逐个判断a有没有这个因子。但是会超时,于是剪枝。#include<iostream>using namespace std;int main(){ long long int a= 9299995937, b= 9955999937; cout << a << b << endl; //cin >> a >> b;
2020-09-21 21:01:04
596
原创 已知两个质数乘积n,求较大的那个质数
题目描述已知正整数n是两个不同的质数的乘积,试求出较大的那个质数。思路从n-1开始尝试能不能被n整除,能被整除的就是较大的那个质数。#include<iostream>using namespace std;int main(){ long long int n; cin>>n; for(long long int x=n-1;x>1;x--) { if(n%x==0) { c
2020-09-17 21:26:17
3086
3
原创 191.number-of-1-bits
191. Number of 1 Bits题目描述计算二进制数的1的个数思路按位计算但是遇到这个输入 uint32_t n 直接就是二进制数,上一题是十进制数的,就很迷惑官方解法循环和位移动使用 位掩码 来检查数字的第 i 位任何数字跟掩码 1 进行逻辑与运算,都可以让我们获得这个数字的最低位。检查下一位时,我们将掩码左移一位。class Solution {public: int hammingWeight(uint32_t n) { int sum=0;
2020-09-17 21:24:58
77
原创 190.reverse-bits
190. Reverse Bits题目描述给你1个十进制无符号数,把它的二进制反转,返回反转后的数的十进制。思路循环十进制转二进制,二进制转十进制。官方解法双指针位运算任何数字和1进行位运算的结果都取决于该数字最后一位n & 1 === 1, 说明n的最后一位是1n & 1 === 0, 说明n的最后一位是0运算符含义描述<<左移用来将一个数的各二进制位全部左移N位,高位舍弃,低位补0。>>右移将一个数
2020-09-17 21:24:30
62
原创 172.factorial-trailing-zeroes
172. Factorial Trailing Zeroes题目描述一个数阶乘后有几个0思路数是5的几倍数就有几个尾0事实上到25就开始不对了官方解法计算阶乘虽然不会在面试中实现它,但是你可以简单描述它是解决问题的办法之一。计算因子 5需要计算每个数字中的因子 5高效的计算因子 5解决多重因子的数字代码class Solution {public: int trailingZeroes(int n) { int result=0; w
2020-09-17 21:23:53
49
原创 169.majority-element
169. Majority Element题目描述找出n个数中出现n/2次的数思路用 map 记录每个数出现的次数,超过 n/2+n%2 次的就 return官方解法哈希表时间复杂度 O(n)空间复杂度 O(n)c++代码class Solution {public: int majorityElement(vector<int>& nums) { unordered_map<int, int> counts;
2020-09-15 11:52:27
51
原创 167.two-sum-ii-input-array-is-sorted
167. Two Sum II - Input array is sorted题目描述给你一组升序的数,找出其中两个相加能得到目标数思路快慢指针,如果加起来不够就移动指针。超出时间限制发现返回值是从1开始不是从0开始,感觉里面有技巧,但是不知道是什么//事实上并没有改进:如果low和end加起来不够就移动慢指针超出时间限制官方解法二分查找固定一个数 i ,从 i 右边开始二分查找 target 和 i 的差时间复杂度O(nlogn)双指针 left 和 right时间复杂
2020-09-15 11:50:38
43
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人