- 博客(310)
- 收藏
- 关注
原创 39 组合总和
这种写法的结果里会有重复的组合:class Solution {public: vector<vector<int>> res; vector<int> path; void trackback(vector<int>& candidates, int target, int start){ if( target < 0 )return; if( target == 0 )res.p
2021-10-21 14:58:00
286
原创 42 接雨水
首先直观解法,位置 i处可以接到的雨水量为 min(l_max[i], r_max[i]) * height[i], 然后res累计这个量,最后加和完的结果就是一共可以接的雨水量。class Solution {public: int trap(vector<int>& height) { int res = 0; int n = height.size(); vector<int> l_max(n);
2021-09-10 09:41:38
153
原创 手把手二叉树第二期
654. 最大二叉树/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(..
2021-08-03 09:35:01
204
原创 手把手二叉树第二期
递归:相信函数的定义,不要跳进细节;搞清楚每个节点做什么,然后就是前、中、后序遍历116. 填充每个节点的下一个右侧节点指针/*// Definition for a Node.class Node {public: int val; Node* left; Node* right; Node* next; Node() : val(0), left(NULL), right(NULL), next(NULL) {} Node.
2021-08-01 15:02:06
267
原创 322. 零钱兑换
其实为了求dp[amount],是把所有小于amount所需要的最小硬币数都要计算出来class Solution {public: int coinChange(vector<int>& coins, int amount) { vector<int> dp(amount+1, amount+1); // 这里所有的都初始化为amount+1了,其实把它设置为任意一个大于amount的都可以,就是给一个比较大的值 dp[0]
2021-07-27 16:42:07
72
原创 56. 合并区间
排序+贪心,先对区间的起始点排序,然后比较下一段区间的起始点和上一段的结束点的大小,两段区间的关系就有如下三种:忘记在哪个链接看到的代码,觉得比其他的解法要优美一些:class Solution {public: static bool cmp(vector<int>& a, vector<int>& b){ if(a[0]<b[0]) return true; return f
2021-07-27 15:53:41
72
原创 NC41 最长无重复子数组
滑动窗口题解(30条消息) NC41-最长无重复子串-【set、双指针】_菜鸟学编程-优快云博客class Solution {public: /** * * @param arr int整型vector the array * @return int整型 */ int maxLength(vector<int>& arr) { // write code here set<i.
2021-07-16 14:03:28
166
原创 牛客网编辑距离
编辑距离_牛客题霸_牛客网 (nowcoder.com)class Solution {public: /** * * @param word1 string字符串 * @param word2 string字符串 * @return int整型 */ int minDistance(string word1, string word2) { // write code here int l1 =
2021-07-16 13:17:56
116
原创 NC15 求二叉树的层序遍历
层次遍历:用栈来保存节点但是涉及到按层输出的话 就需要两个queue队列,其中一个队列用来保存每一层的节点/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */class Solution {public: /** * * @param root TreeNode类 * @return int整型vector
2021-07-14 20:13:54
157
原创 NC105 二分查找-II
就是二分查找左边界注意点就是如果采取左闭右开,那在设置left和right的时候,也要考虑这个问题class Solution {public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 如果目标值存在返回下标,否则返回 -1 * @param nums int整型vector * @param target int整型 * @return int整型 */
2021-07-14 15:36:28
113
原创 NC76 用两个栈实现队列
用一个栈保存输入push的,当要pop的时候把第一个栈的element pop出放到第二个栈里,然后删除front的元素class Solution{public: void push(int node) { stack1.push(node); } int pop() { while( !stack1.empty()){ int tmp = stack1.top(); stack1.pop(
2021-07-14 15:28:41
110
原创 NC4 判断链表中是否有环
开启牛客网,熟悉牛客网编程环境链表有环,自然是快慢指针/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: bool hasCycle(ListNode *head) {
2021-07-14 15:21:39
63
原创 剑指 Offer 24. 反转链表
参考题解反转链表 - 反转链表 - 力扣(LeetCode) (leetcode-cn.com)/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* rev
2021-07-12 22:43:23
77
原创 剑指 Offer 20. 表示数值的字符串
感觉k神的讲解太复杂了orz面试题20. 表示数值的字符串(有限状态自动机,清晰图解) - 表示数值的字符串 - 力扣(LeetCode) (leetcode-cn.com)k神讲解下的评论感觉更有助于理解:剑指offer中的代码:class Solution {private: // 整数的格式可以用[+|-]B表示, 其中B为无符号整数 bool scanInteger(const string s, int& index){ if(s.
2021-07-12 22:24:18
92
原创 剑指 Offer 68 - I. 二叉(搜索)树的最近公共祖先
1. 二叉搜索树的最近公共祖先需要用一个parent数组来存储父亲节点?题解面试题68 - I. 二叉搜索树的最近公共祖先(迭代 / 递归,清晰图解) - 二叉搜索树的最近公共祖先 - 力扣(LeetCode) (leetcode-cn.com)/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNo...
2021-07-12 21:18:24
107
原创 剑指 Offer 67. 把字符串转换成整数
首先,字符串中可能出现的字符包括空格、数字、正负号、大小写字母、标点符号并且 如果字符串内有数字,如果不是在最开始,那么在中间的数字也不算有效的、可转换的,所以第一个非空字符要么是负号‘-’,要么是数字a按照自己的理解,写了一份:class Solution {public: int strToInt(string str) { int len_str = str.size(); if(len_str == 0)return 0; //
2021-07-12 20:19:33
163
1
原创 剑指 Offer 66. 构建乘积数组
不能使用除法,参考题解剑指 Offer 66. 构建乘积数组(表格分区,清晰图解) - 构建乘积数组 - 力扣(LeetCode) (leetcode-cn.com),那就要分别维护 i 左侧和右侧的乘积值下三角的计算:上三角的计算:class Solution {public: vector<int> constructArr(vector<int>& a) { int len_a = a.size(); ...
2021-07-12 16:53:13
81
原创 剑指 Offer 65. 不用加减乘除做加法
不能用加减乘除做加法 那就只有位运算、逻辑符这一些了题解面试题65. 不用加减乘除做加法(位运算,清晰图解) - 不用加减乘除做加法 - 力扣(LeetCode) (leetcode-cn.com)但是参照javadedaima写成c++,却报错如下:class Solution {public: int add(int a, int b) { while( b!=0){ int c = (a&b)<<1; ..
2021-07-12 15:38:15
71
原创 剑指 Offer 64. 求1+2+…+n
不能用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)题解求1+2+…+n - 求1+2+…+n - 力扣(LeetCode) (leetcode-cn.com)面试题64. 求 1 + 2 + … + n(逻辑符短路,清晰图解) - 求1+2+…+n - 力扣(LeetCode) (leetcode-cn.com)不能用求和公式,不能循环加和 → 只能用递归不能 if 判断终止条件 → 逻辑符短路class S...
2021-07-12 14:36:21
68
原创 剑指 Offer 63. 股票的最大利润
限制是后面的数字要比前面的数字大,然后找差最大的pair,或许用滑动窗口来解?更简单的思路:找到最小值,然后在此最小值往后找最大值这个思路有bug,因为最大利润不一定在整个数组最小值处取到,因为最小值有可能在数组的最后一位,后面未必会有比这个值大的值。所以这个思路不可行。而且滑动窗口也不适合这道题,还是应该用动态规划解面试题63. 股票的最大利润(动态规划,清晰图解) - 股票的最大利润 - 力扣(LeetCode) (leetcode-cn.com)最开始没有给cost初始化,
2021-07-12 14:15:31
92
原创 剑指 Offer 62. 圆圈中最后剩下的数字
约瑟夫环题解Java解决约瑟夫环问题,告诉你为什么模拟会超时! - 圆圈中最后剩下的数字 - 力扣(LeetCode) (leetcode-cn.com)最后一轮的位置是0,最后一轮的个数是2,所以res初始值为0,i初始值为2class Solution {public: int lastRemaining(int n, int m) { int res = 0; for( int i = 2; i <= n; i ++){ .
2021-07-12 11:31:58
46
原创 剑指 Offer 61. 扑克牌中的顺子
0可以作为任何数首先要判断有可能有重复的牌,去掉重复的牌后,1是要判断最大值、最小值的差距,如果小于等于4,还有可能,需要后续判断0是否足够补上连续序列中缺失的,如果最大值、最小值的差距已经大于4了,那就绝对不可能了...
2021-07-12 11:13:52
94
原创 剑指 Offer 60. n个骰子的点数
感觉想不到思路i的一般都是动态规划]题解【n个骰子的点数】:详解动态规划及其优化方式 - n个骰子的点数 - 力扣(LeetCode) (leetcode-cn.com)主要思路:dp[n][i]表示掷了n个骰子总点数为i,出现的次数class Solution {public: vector<double> dicesProbability(int n) { vector<double> probability; .
2021-07-10 23:13:43
68
2
原创 剑指 Offer 59 - II. 队列的最大值
用一个队列来保存最大值的索引?但是一旦pop,这些索引就都变了就不对应了题解如何解决 O(1) 复杂度的 API 设计题 - 队列的最大值 - 力扣(LeetCode) (leetcode-cn.com)这种保存最大值,而且元素进出队会造成最大值丢失的问题,一般都采用双端队列deque来解决,这个双端队列deque用来保存最大值,在构造deque的时候,什么元素要入队呢?什么元素要出队呢?需要将队内小于 待入队的元素都pop出,然后再把新元素入队class MaxQueue {pri
2021-07-10 22:27:19
61
原创 剑指 Offer 59 - I. 滑动窗口的最大值
一共有 L - 2 个窗口,可以第一个窗口先找到最大值,记录最大值,然后每次滑动一个位置,首先得看滑出去的那个值是不是前一个窗口的最大值,滑出去的那个值是前一个窗口的最大值,如果新进来的那个值比出去那个值大,那就是他,如果小,就需要在当前窗口内再查找一个最大值,但其实这样做了很多重复工作,因为窗口内的很多值都被重复比较了。题解C++ 单调队列 deque | 滑动窗口最大值 - 滑动窗口的最大值 - 力扣(LeetCode) (leetcode-cn.com)要用双向队列来保存 最大值cand.
2021-07-10 21:54:43
68
原创 剑指 Offer 58 - II. 左旋转字符串
创建2个新的临时字符串,分别保存前后2个字符串class Solution {public: string reverseLeftWords(string s, int n) { int length_string = s.size(); if( n == length_string)return s; string front = s.substr(0, n); string back = s.substr(n, length
2021-07-10 21:14:27
63
原创 剑指 Offer 58 - I. 翻转单词顺序
先把所有的单词都找出来,因为要倒序输出,所以这里我采取了strack来存储,后进先出class Solution {public: string reverseWords(string s) { string res; stack<string> words; int length_string = s.size(); int left = 0; while(left < length_stri
2021-07-10 21:06:17
67
原创 剑指 Offer 57 - II. 和为s的连续正数序列
有个限制是要连续的正整数序列,如果是连续的,那么其中一个区间必定是[(s-1)/ 2, (s+1)/2],让然后对于这两个数再分别/2,然后对得到的数再拆解/2,oh不行 没啥思路看了下题解什么是滑动窗口,以及如何用滑动窗口解这道题(C++/Java/Python) - 和为s的连续正数序列 - 力扣(LeetCode) (leetcode-cn.com),竟然要用滑动窗口来解:class Solution {public: vector<vector<int>>
2021-07-10 16:48:27
81
原创 剑指 Offer 57. 和为s的两个数字
有序序列,那么可以先用二分缩小查找区间,因为比target大的数肯定不会嘛,然后双指针一个从头,一个从尾,按照如上思路,写了下代码:class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { int left = 0; int right = nums.size() - 1; int mid = left + (right
2021-07-10 15:59:53
66
原创 剑指 Offer 55 - II. 平衡二叉树
1 .后序遍历+剪枝二叉树中任意节点的左右子树深度不超过1就是平衡的,那需要记录每一个节点的左右子树深度?但是感觉如果要一个一个节点的算,有很多重复操作,比如靠近下面的节点是决定是否平衡的关键,如果下面不平衡,整棵树就不平衡,如果下面平衡了,再去判断上面的节点。、看了下题解面试题55 - II. 平衡二叉树(从底至顶、从顶至底,清晰图解) - 平衡二叉树 - 力扣(LeetCode) (leetcode-cn.com),我的想法和解法一的思路一样,但是实现不出来,所以参考题解实现了一下:其中re
2021-07-10 15:37:11
74
原创 剑指 Offer 55 - I. 二叉树的深度
树的层级遍历?用队列实现层次遍历,所以不需要另写一个helper函数递归1. 层级遍历 无意的ac 误打误撞的看了题解面试题55 - I. 二叉树的深度(后序遍历、层序遍历,清晰图解) - 二叉树的深度 - 力扣(LeetCode) (leetcode-cn.com),仿照着写了c++,但是这里我res初始化是-1,最后也ac了,看了下代码,区别是判断语句/** * Definition for a binary tree node. * struct TreeNode { *
2021-07-10 14:11:03
103
原创 剑指 Offer 54. 二叉搜索树的第k大节点
直观的就是中序遍历,但我想了一下要第k大的,如果是升序的话,比较容易找第k小的,所以为了得到降序序列,我进行了先 右子树-> 根->左子树的遍历,这样会得到降序序列,然后在遍历的时候,只要找到了n个数就可以返回了,不必都遍历完,如下是我的代码,很多命名比如preorder, ascending是因为一开始是按照前序遍历写的,后面也没有改名字/** * Definition for a binary tree node. * struct TreeNode { * int.
2021-07-10 11:42:03
49
原创 剑指 Offer 53 - II. 0~n-1中缺失的数字
很多条件啊,单调递增序列,或许可以二分查找,因为是递增的,而且序列长度是n-1,有0~n这n个数,所以能不断缩小区间,题解面试题53 - II. 0~n-1 中缺失的数字(二分法,清晰图解) - 0~n-1中缺失的数字 - 力扣(LeetCode) (leetcode-cn.com)还有一个可以利用的就是下标和数值是一一对应的,所以可以判断下标mid的位置存放的是不是mid这个值class Solution {public: int missingNumber(vector<i
2021-07-09 20:01:11
60
原创 剑指 Offer 53 - I. 在排序数组中查找数字 I
1. 两轮二分查找或许可以找左边界和右边界(今早上刚看的二分查找 可以获取左右边界)凭着理解和记忆写了一下:class Solution {public: int search(vector<int>& nums, int target) { int left = 0, right = nums.size() - 1; // 找左边界 while( left <= right ){ int
2021-07-09 19:39:07
85
原创 剑指 Offer 56 - II. 数组中数字出现的次数 II
出现3次,先同或再异或?如果先同或,其实是相当于消掉 1-pair相同的,问题就变成了只有一个数字出现一次,其他的都出现两次。想得太天真了orz。解法一题解面试题56 - II. 数组中数字出现的次数 II(位运算 + 有限状态自动机,清晰图解) - 数组中数字出现的次数 II - 力扣(LeetCode) (leetcode-cn.com)位运算+有限状态机,反正我没看懂orzclass Solution {public: int singleNumber(vector<
2021-07-09 15:34:44
138
原创 剑指 Offer 56 - I. 数组中数字出现的次数
要求空间复杂度是O(1),所以不能用哈希表存时间复杂度是O(n)找不同的数字,用位操作除了一个数字-全员异或如果是找除了一个数字以外,其他数字都出现了两次,那么如何找到出现一次的数字:全员异或除了两个数字-分组异或把这2个数字分到不同的组里,而每个组内除了这一个数字外其他的都是两两 pair 一对的,这压根每一组内的异或完的结果就是不一样的那个值题解数组中数字出现的次数 - 数组中数字出现的次数 - 力扣(LeetCode) (leetcode-cn.com)cla..
2021-07-09 14:37:25
55
原创 剑指 Offer 52. 两个链表的第一个公共节点
1. 疑惑-快慢指针这个例子里的答案为什么不是节点1啊:所以一开始我用快慢指针来做,提交代码如下:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode *
2021-07-09 10:47:27
60
原创 剑指 Offer 51. 数组中的逆序对
肯定不能直接穷举,时间复杂度太高这种逆序对就是应该用归并排序来找1. 归并排序首先归并排序的代码:归并排序的调用栈是首先主函数(这里以reversepairs为例)→mergeSort【内部调用 2次mergeSort + 1次 merge】class Solution {public: int reversePairs(vector<int>& nums) { vector<int> tmp; int ll =
2021-07-08 17:14:27
70
1
原创 剑指 Offer 50. 第一个只出现一次的字符
要只出现一次的字符,而且要记录最早出现的那个面试题50. 第一个只出现一次的字符(哈希表 / 有序哈希表,清晰图解) - 第一个只出现一次的字符 - 力扣(LeetCode) (leetcode-cn.com)c++ 哈希表中暴力解:class Solution {public: char firstUniqChar(string s) { int res = 50001; if( s == "")return ' '; .
2021-07-07 23:02:23
69
1
原创 剑指 Offer 49. 丑数
竟然也是用动态规划来解 题解剑指 Offer 49. 丑数(动态规划,清晰图解) - 丑数 - 力扣(LeetCode) (leetcode-cn.com)穷举每一个丑数,其中一个很重要的点就是,任何一个丑数都一定是由比它小的丑数×2或者×3或者×5得到的,这里从0开始的p2、p3、p5是索引,是dp中丑数的索引class Solution {public: int nthUglyNumber(int n) { vector<int> dp(n, 1);.
2021-07-07 21:07:21
62
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人