![](https://img-blog.csdnimg.cn/20210204000948611.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
LeetCode
主要是写写自己做过的题
1.01
这个作者很懒,什么都没留下…
展开
-
剑指Offer集合
剑指Offer题目链接滑动窗口的最大值点击从尾到头打印链表点击数组中重复的数字点击链表集合(四道题)点击第一个只出现一次的字符点击字符串转换整数 (atoi)点击原创 2021-03-21 15:13:02 · 86 阅读 · 0 评论 -
一百道编程题
力扣精选top面试题一百道NO.1两数之和NO.2两数相加No.3无重复字符的最长子串NO.4最长回文子串No.5寻找两个正序数组的中位数NO.6整数反转No.7字符串转换整数 (atoi)No.8最多水的容器...原创 2021-02-04 00:05:31 · 242 阅读 · 0 评论 -
------相交链表
思路:可以分别统计两条链表的长度,然后让长的那条先走长度差个单位;方法2看代码力扣解释class Solution {public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { if(headA==NULL || headB==NULL) return NULL; ListNode*q,*p; q = headB; p = head.原创 2021-10-10 15:40:33 · 68 阅读 · 0 评论 -
剑指 Offer . 二叉搜索树与双向链表
题目链接!思路:这道题的就是遍历模式的模板题,通过变量pre来记录前一个遍历的点即可,只需注意一下刚开始pre==NULL的情况。代码:/*// Definition for a Node.class Node {public: int val; Node* left; Node* right; Node() {} Node(int _val) { val = _val; left = NULL; ..原创 2021-04-24 09:00:32 · 54 阅读 · 0 评论 -
排序链表
思路:基本上与顺序存储方式的思想是一样的代码://归并排序 递归版本class Solution {public: ListNode* sortList(ListNode* head, ListNode *tail = nullptr) { if(!head) return nullptr; if(head->next == tail){ head->next = nullptr; retur.原创 2021-04-23 19:42:29 · 45 阅读 · 0 评论 -
数组中的第K个最大元素
题目链接!思路:模板题,要么用快速选择算法,要么就是手写堆(一般不会让你用容器)代码:class Solution {public: int st = 0; void quick_sort(vector<int>& nums,int left,int right,int &k){ int i = left,j = right; int temp = nums[left]; while(i<j){.原创 2021-04-18 20:22:51 · 80 阅读 · 0 评论 -
寻找旋转排序数组中的最小值
题目链接!思路:这道题的话,我们就用二分来做,就只有一个不一样的点,那就是我们比较步骤的那个值是可以变化的,随着二分的分法进行下去;代码:class Solution {public: int findMin(vector<int>& nums) { int low = 0; int high = nums.size() - 1; while (low < high) { int mid = .原创 2021-04-18 14:59:20 · 93 阅读 · 0 评论 -
阶乘后的零
题目链接!思路:这道题是数学题,我们可以把阶乘的数字铺展开来,你会发现只有因子2*5才会产生0的数字,而且你会发现只要出现了5就一定会有2出现,也就是说2的个数一定比5的个数多,所以我们只要算因子中有5的个数即可,注意:数字25,数字125等等他们的因子是有多个5,我们又怎么计算呢?看代码,想想即可。代码:class Solution {public: int trailingZeroes(int n) { int sum =0; while(n){ .原创 2021-04-02 17:31:21 · 58 阅读 · 0 评论 -
复制带随机指针的链表
题目链接!思路:这道链表题还是有点意思,我们的思路就是在每一个节点后面创建相同的节点,然后遍历原先的节点,填充新节点的random指针,因为当我们遍历某个节点,它的random指针指向的节点,我们是可以往后弄一个就是对应新节点的random指针的指向!然后我们再把两条新旧链表分开即可。好好看看代码学习一下。代码:/*// Definition for a Node.class Node {public: int val; Node* next; Node* rando.原创 2021-03-31 20:20:25 · 55 阅读 · 0 评论 -
分割回文串
题目链接!思路:这道题,我感觉也是学习dfs的好题,学dfs,个人觉得就是有几点要注意,什么时候结束递归?要不要剪枝?要不要恢复现场?这几点就够了。(图来自此处)这里我们要一个中转容器去记录遍历过的答案,在结束递归的时候就放进目的容器中,当然,在每次回溯的时候是需要进行pop操作的!代码:class Solution {public: vector<vector<string>> res; int n; vector<vector<.原创 2021-03-31 17:24:27 · 54 阅读 · 0 评论 -
加油站
题目链接!思路:这道题有几种做法,最简单的的就是双重for循环,考虑从每一个点出发,如果说能回到当前点就证明这个点是可以跑完一圈的,否则继续遍历下面的节点;版本二:代码://版本一,双重for循环class Solution {public: int canCompleteCircuit(vector<int>& gas, vector<int>& cost) { int remain = 0; int n =.原创 2021-03-30 21:17:14 · 66 阅读 · 0 评论 -
用 Rand7() 实现 Rand10()
题目链接!思路:这道题的话,我们应该知道如果用两次rand7()是可以创造出1到49的数字(相等概率),在这里我们要舍弃41到49之间的数即可。当然,这道题应该仔仔细细研究,有优化的法子。(记得看看文章!)很不错的详解!代码:class Solution {public: int rand10() { int row, col, idx; do { row = rand7(); col = rand7();.原创 2021-03-30 20:32:42 · 216 阅读 · 3 评论 -
剑指 ------- 顺时针打印矩阵
题目链接!思路:这道题是道简单题,顺时针打印,我们就可以用四个变量来记录上下左右的范围,就是说每次放入一行或者一列,那么相对应的四个变量之一就要+1或者-1,然后在判断是否遍历完了即可。可看代码想想。代码:class Solution {public: vector<int> spiralOrder(vector<vector<int>>& matrix) { vector<int> q; if(ma.原创 2021-03-30 10:52:28 · 53 阅读 · 0 评论 -
单词接龙(BFS,有点意思的题)
题目链接!思路:这道题是道BFS题,但是比较有难度,这里我们是用bfs“建图”,是虚拟建图,先用set容器保存我们的单词列表(当然我们先把begin_word这个单词在列表中删除,如果有的话。)通过队列从begin_word出发,开始一层一层遍历;首先我们先出队首,对head_word进行每个字母的转换(s.size()*26的时间复杂度),对了,我们还得用visit_set容器记录我们之前遍历过的单词(是指在单词列表中),因为我们知道bfs搜索一旦到达终点,一定是最少步数的答案!步数是很好记录的.原创 2021-03-29 17:16:37 · 200 阅读 · 0 评论 -
验证回文串
题目链接!思路:这道题没什么难度,就是怎么区分标点符号,数字,字母之类的,c语言函数有很多封装好的字符串函数可以用,记住好这些函数就可以了。点此了解!代码:class Solution {public: bool isPalindrome(string s) { if(s.size()==0) return true; for(int i=0,j=s.size()-1;i<j;){ if(ispunct(s[i]) || i.原创 2021-03-29 16:36:47 · 56 阅读 · 0 评论 -
填充每个节点的下一个右侧节点指针(BFS)
题目链接!思路:这道题的话,是bfs模板题,很典型的搜索题,把root节点放进队列中,然后遍历每一层的节点,在最后节点的next设置为NULL即可。代码:/*// Definition for a Node.class Node {public: int val; Node* left; Node* right; Node* next; Node() : val(0), left(NULL), right(NULL), next(NULL) {}..原创 2021-03-29 16:12:01 · 78 阅读 · 0 评论 -
将有序数组转换为二叉搜索树
题目链接!思路:这道题还是比较考察基础的,我们要知道如果给一个有序数组,它弄成二叉搜索树的形状是有很多种的,最简单的就是斜二叉树。但是这道题它限制了,是要我们弄成AVL树,但是这个AVL树同样是有多种多样的。方法是有两种,我们可以选择中间数字作为二叉搜索树的根节点,这样分给左右子树的数字个数相同或只相差 1,可以使得树保持平衡。如果数组长度是奇数,则根节点的选择是唯一的,如果数组长度是偶数,则可以选择中间位置左边的数字作为根节点或者选择中间位置右边的数字作为根节点,选择不同的数字作为根节点则创建的平.原创 2021-03-29 15:58:45 · 92 阅读 · 0 评论 -
将二叉搜索树变平衡
题目链接!思路:这道题我自己觉得是很重要的题,可以锻炼二叉树的遍历方法。首先我们得知道,当给二叉搜索树建立AVL树的时候,是可以直接选择中间的点开始建立的,这样左右两边的节点是差不多相等的(可能出现某边比某边多一个,但这都不影响AVL平衡的规则)其次二叉树的遍历方式是有很多种的,需要我们去掌握的:递归,非递归,Morries遍历这三种。这里的做法就是先把树按照中序遍历,得到中序数组,然后再创建AVL树。点击此处,这里有直接手撕AVL树的代码!代码:/** * Definition for .原创 2021-03-28 15:36:16 · 161 阅读 · 0 评论 -
剑指 Offer -------- 求1+2+…+n
题目链接!思路:这道题有很多种做法,有一种奇葩的做法就是下面代码中注释的那种,通过申请一个数组来计算即可。知识点:常见的逻辑运算符有三种,即 “与 && ”,“或 || ”,“非 ! ” ;而其有重要的短路效应,如下所示:if(A && B) // 若 A 为 false ,则 B 的判断不会执行(即短路),直接判定 A && B 为 falseif(A || B) // 若 A 为 true ,则 B 的判断不会执行(即短路),直接判.原创 2021-03-28 10:25:35 · 88 阅读 · 0 评论 -
剑指 Offer ------ 不用加减乘除做加法
题目链接!思路:图片来自此处!代码:class Solution {public: int add(int a, int b) { if (a == 0 || b == 0) { return a == 0 ? b : a; } int sum = 0, carry = 0; while (b != 0) { // 当没有进位的时候退出循环 sum = a.原创 2021-03-27 21:01:59 · 72 阅读 · 0 评论 -
剑指 Offer ------- 二叉树的最近公共祖先
题目链接!思路:出自此处,请点击!这里的话,用dfs去搜索,其实是把整棵树搜索的(除了p,q节点以下的子树没有搜索外,哪怕你在某root的左子树找到了p,q的最近公共祖先,它还是会把root的右边进行搜索的)代码:class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if(root == null || root == p || roo.原创 2021-03-27 11:25:34 · 81 阅读 · 0 评论 -
剑指 Offer --------- 翻转单词顺序
题目链接!思路:这道题的话我们就按照如下步骤来做:倒序遍历字符串 ss ,记录单词左右索引边界 ii , jj ;每确定一个单词的边界,则将其添加至单词列表 resres ;最终,将单词列表拼接为字符串,并返回即可。代码:class Solution {public: string reverseWords(string s) { string res; if(s.size()==0 ) return s; int right =.原创 2021-03-27 10:41:18 · 64 阅读 · 0 评论 -
剑指 Offer -------- 二进制中1的个数
思路:这道题有很多种做法,最简单的就是循环遍历32位,还有一种高效的做法就是利用lowbit去做,lowbit返回值表示元素的二进制中最后一个1的数值,哪怕是负数,他也会计算所有位的,包括符号位。代码:class Solution {public: int low_bit(uint32_t n){ return n&(-n); } int hammingWeight(uint32_t n) { int ans = 0; .原创 2021-03-22 16:20:11 · 59 阅读 · 0 评论 -
剑指 Offer ------- 剪绳子
题目链接!思路:这道题是个数学证明题,当然也是很容易就能想得出,用贪心的思维去做,我们可以知道这个推论:尽可能将绳子以长度 3 等分为多段时,乘积最大。 那么就会有余数的情况下,如果为2则不用拆分,如果为1的话,那么就要把一个3加上这个1拆分成2+2。具体证明点击此处!代码:class Solution {public: int cuttingRope(int n) { if(n==2) return 1; if(n==3) return 2; .原创 2021-03-22 15:28:52 · 57 阅读 · 0 评论 -
剑指 Offer ------- 机器人的运动范围
题目链接!思路:这道题也是典型的搜索题,你可以用bfs或者dfs写都可以,我这里用的是bfs,就从(0,0)这个点出发,然后从这个点开始向周围遍历,一般是上下左右,但是这道题可以缩减为向下或者向右,然后用一个二维数组进行点的标记即可,把符合的点放入队列中,再循环遍历即可。代码:class Solution { // 计算 x 的数位之和 int get(int x) { int res=0; for (; x; x /= 10) { .原创 2021-03-22 15:04:37 · 70 阅读 · 0 评论 -
剑指 Offer -------矩阵中的路径
题目链接!思路:这道题的话,我们主要是用dfs(当然你也可以用bfs),是道很典型的搜索模板题,这里值得注意的一点就是,我自己写这个dfs的时候,很喜欢用一个book数组来标记哪个节点是否走过,但是其实我们是可以不需要的,在dfs中,我们可以改变这个节点的值来告知这个节点已经遍历过,在回溯的时候恢复成原先的数据即可。代码:class Solution {public: bool exist(vector<vector<char>>& board, stri.原创 2021-03-22 11:09:18 · 54 阅读 · 0 评论 -
剑指 Offer ------- 旋转数组的最小数字
思路:这道题其实有点坑的。那就是如果数组李曼有重复值情况。比如3,1,1,2,2,2,2,2这种情况,这道题无疑就是用二分来做,只需要查找数组最后一个元素的分界线即可,但就是怕出现上面那种特殊的情况,这里的做法就是把要比较分界线末尾的元素再往前挪一位,用前一位去找分界线,如果前一位还有重复值,那么继续往前挪即可。代码:class Solution {public: int minArray(vector<int>& numbers) { int i = .原创 2021-03-22 10:51:44 · 76 阅读 · 0 评论 -
剑指 Offer ------- 重建二叉树
题目链接!思路:这道题的话,我们只需要知道二叉树的遍历特点即可,前序数组的第一个数字就是我们要建立的第一个根节点的值,那么我们就需要在中序数组上遍历得到左右子树的划分,我们知道中序是LDR,所以在根节点x的左边一定是左子树,周而复始递归即可。代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; .原创 2021-03-22 10:25:51 · 54 阅读 · 0 评论 -
剑指 Offer ------------ 用两个栈实现队列
思路:这道题的话,就是用栈的思想去做,一个栈用来进数,然后当要出数字的时候,只需要看看另外一个栈有没有数字,如果没有的话,就把栈1的数字放进栈2,此时栈2就相当于是队列中放置的元素。代码:class CQueue {public: CQueue() { } void appendTail(int value) { st1.push(value); return ; } int deleteHead() {.原创 2021-03-22 10:19:46 · 46 阅读 · 0 评论 -
剑指 Offer ------- 替换空格
思路:这道题的话就是统计一下空格的个数,然后再换成%20的总的字符串长度,采取双指针。从后面开始往前遍历即可,具体看代码。代码:class Solution {public: string replaceSpace(string s) { int tmp = 0; for(auto &i:s){ if(i==' ') ++tmp; } int len = s.size() + tmp*2;.原创 2021-03-21 16:42:21 · 54 阅读 · 0 评论 -
剑指 Offer ------------ 二维数组中的查找
题目链接!思路:这道题的话,我们可以从题目中约束数组的条件出发,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序,这样我们可以从左上角开始遍历,如果当前元素大于target,那么就把这一列去掉;如果小于则把这一行去掉即可。代码:class Solution {public: bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) { if(m.原创 2021-03-21 16:25:20 · 62 阅读 · 0 评论 -
P2440 木材加工(二分)
题目链接!思路:代码:#include<iostream>#include<algorithm>using namespace std;#define ll long longconst int maxn = 1e5 + 10;int a[maxn], n, maxx, ans;ll c, mid;bool check(ll x){ if(x==0) return false; ll sum = 0; for (int i = 1; i ..原创 2021-03-21 15:21:50 · 283 阅读 · 0 评论 -
平衡二叉树
思路:你只要记住,几乎所有关乎二叉树的题基本上都能用遍历的方式去做,无非就是在遍历的过程中添加一些操作。这道题,我们只要知道平衡二叉树的性质即可,左右子树的高度差只能在1以内,可以等于1.代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), l.原创 2021-03-21 15:17:47 · 57 阅读 · 0 评论 -
二叉搜索树以及完全二叉树判断
思路:这里只讲完全二叉树的思路,搜索二叉树可以看我这篇博客,请点击!完全二叉树按照以下步骤解题即可:按层序遍历,从每层的左边向右边依次遍历所有的节点如果当前的节点有右孩子节点,但是没有左孩子节点,直接返回false如果当前节点并不是左右孩子节点全有,那么之后的节点必须都为叶节点,否则直接返回false遍历过程中如果不返回false,则遍历结束以后返回true代码:/** * struct TreeNode { * int val; * struct TreeNode *left;.原创 2021-03-21 15:17:33 · 223 阅读 · 0 评论 -
剑指offer ------ 二叉搜索树的后序遍历序列
题目链接!思路:这道题的话我们要知道二叉搜索树的特点即可,具体细节都在代码中,这道题也可以改成恢复原二叉搜索树,可以试着写写。代码:class Solution {public: //递归 bool verifyPostorder(vector<int>& postorder) { if(postorder.empty())return true; return isBST(postorder, 0, postorder.siz.原创 2021-03-21 15:15:20 · 71 阅读 · 0 评论 -
二叉树中的最大路径和以及二叉树中和位某一值得路径
思路:具体的思路也在代码里,也就是看看左右节点能贡献出多大的值,有些代码细节还得好好琢磨。题解链接!代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * Tree.原创 2021-03-21 15:15:01 · 57 阅读 · 0 评论 -
满二叉树的题(先序求后序,后序建树等等)
#include <iostream>#include <thread>#include <string>#include <chrono>#include <future># include <cmath># include <vector>#include <Windows.h> using namespace std;int deep=0;struct node{ int val原创 2021-03-21 15:14:48 · 230 阅读 · 0 评论 -
剑指Offer-------在排序数组中查找数字 I
思路:这道题是很典型的二分基础题,这里我自己写的二分是分两种的,可以理解为最小范围找最大值以及最大范围找最小值。代码:class Solution {public: int func_1(vector<int>& nums,int target){ int l = 0,r = nums.size()-1; while(l<r){ int mid = (l+r) >> 1; .原创 2021-03-21 15:13:32 · 54 阅读 · 0 评论 -
力扣精选top面试题-------买卖股票的最佳时机集合
题目链接!思路:这道题有多种解法,解法一我们可以直接用一个变量来记录某个数的右边最大值x,通过最大值x与该数进行比较,如果发现x是大于该数的,那么就能产生效益,然后只需要从尾到头进行遍历即可。另一种动态规划解法:代码:class Solution {public: int maxProfit(vector<int>& prices) { int Max = -1; int ans = 0; //目标量 for(.原创 2021-03-09 16:02:29 · 88 阅读 · 0 评论 -
力扣精选top面试题--------杨辉三角
题目链接!思路:这道题就是简单题,每次一层时,我们可以先添加1,然后添加一定个数的值后,再添加1即可。具体可以看代码。代码:class Solution {public: vector<vector<int>> generate(int numRows) { vector<vector<int> > ans; ans.push_back({1}); if(numRows==..原创 2021-03-09 15:36:20 · 79 阅读 · 0 评论