![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构和刷题
wuxtwu
这个作者很懒,什么都没留下…
展开
-
四则表达式
如果能转换为 逆波兰 表达式,那么每次遇到操作符,弹出两个数运算即可关于如何转 逆波兰 表达式:1.如果遇到操作数,则直接输出。2.如果遇到操作符,则检查栈顶元素优先级,如果其优先级不低于当前操作符(左括号除外),则弹出栈顶元素并输出。重复此过程直到栈顶元素优先级小于当前操作符或为左括号,或者栈为空。 然后将当前操作符压入栈中。3.如果遇到左括号,直接压入栈中。4. 如果遇到右括号,则将栈中元素弹出,直到遇到左括号为止。左括号只弹出栈而不输出。5.表达式处理完毕,则将栈中元素依次弹出。注意只原创 2020-07-17 11:08:20 · 107 阅读 · 0 评论 -
leetcode买股票
121. 买卖股票的最佳时机只能买一次当前价格减最低价即可class Solution { public int maxProfit(int[] prices) { if (prices==null || prices.length==0)return 0; int minVal = prices[0]; int maxVal = Integer.MIN_VALUE; for (int i=0;i<pri原创 2020-07-11 15:19:09 · 107 阅读 · 0 评论 -
二叉树层序遍历
用队列存储,一般存储的是节点的指针。1、基础版本:#include<iostream>#include<queue>using namespace std;struct node{ int val; struct node*left; struct node*right; node(int v):val(v),left(nullptr),right(nu...原创 2019-03-25 11:31:33 · 86 阅读 · 0 评论 -
中序 和前序/后序建树
基本思路是递归,参数是 i, j 是 绝对坐标,想对于 整体的坐标参考自:https://www.cnblogs.com/bmrs/archive/2010/08/19/SloveTree.html#include<iostream>#include<vector>#include<string>using namespace std; str...原创 2019-03-20 17:24:15 · 401 阅读 · 0 评论 -
先增后减数组求最大,先减后增数组求最小
注意到数组的特性,利用好即可参考:https://blog.csdn.net/liuweiyuxiang/article/details/100905327?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_source=distribute.pc_relevant.n...原创 2020-04-20 00:02:32 · 489 阅读 · 0 评论 -
归并排序 递归与非递归实现
package MergeKsort;class Test{ public void merge(int []arr,int left, int mid,int right) { int i = left; int j= mid+1; int n = right - left + 1; int []tmp ...原创 2020-04-19 18:15:18 · 89 阅读 · 0 评论 -
红黑树与跳表
先分析一波红黑树吧。。根节点到任意一个叶子节点所经过的节点数量是相同的每个节点或者是红色,或者是黑色(定义)根节点一定是黑色的(对应2-3树的2节点和3节点)空节点是黑色的如果一个节点是红色的,那么它的孩子节点都是黑色的根节点到任意一个叶子节点所经过的黑节点个数是一样的,即红黑树是一颗保持黑平衡的二叉树,不是平衡二叉树,但左右子树的黑色节点保持绝对的平衡,增删改查复杂度 O...原创 2020-04-12 09:46:13 · 2838 阅读 · 0 评论 -
KMP算法小结
其核心在于:next数组理解next数组得首先明白某个字符的最大前缀和最大后缀的定义:abcabcYX对于最后一个字符Y而言,其最大前缀abc,最大后缀abc,那么X的next值为3这个字符的next数组为:-1,0,0,0,1,2,3,0next数组的球法:核心思路是cn不断往前跳,每跳一次,判读b与跳到的字符是否相同有了next数组,则从长数组的当前值和短字符串中...原创 2020-02-03 13:11:05 · 120 阅读 · 0 评论 -
leetcode-求字符串中的最大回文字符
https://leetcode.com/problems/longest-palindromic-substring此题有较多的解法,在此用了动态规划的做法:https://www.cnblogs.com/grandyang/p/4464476.htmldp[j][i] : 表示 下标为 从 j -> i 的字符串是否为回文字符串。可以做如下判断:初始 当 j==i 时,dp...原创 2019-05-07 21:38:15 · 106 阅读 · 0 评论 -
树的子结构
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)p1是主树,p2是子树这道题就是递归的典型应用。逻辑清楚的话,最好用两个递归 ,主递归用来,判断当前值 是否 相等,如果相等,则进入另一个判断是否是子树的递归中;如果不等,则 判断 主树 的左 或 右 是否和其 相等 。 (相当于 主递归 是 处理不相等 的);关于 相等 的递归,主要...原创 2019-05-20 20:57:55 · 76 阅读 · 0 评论 -
表示数值的字符串
题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。可以观察总结错误的字符串的格式:“+/-" 只可能出现在开头 或者 E/e后,且不能连续出现;“.” 只能出现一次,且其前面不能有 ...原创 2019-05-11 13:33:30 · 101 阅读 · 0 评论 -
输出链表中倒数第K个节点
比如 0-1-2,倒数第三个节点是0.此题用快慢指针,特别注意 边界吧!!!第一个指针 先走 k-1步,判断时要判断 p->next != NULL;/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solutio...原创 2019-05-16 09:52:15 · 174 阅读 · 0 评论 -
链表中环的入口节点
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。证明可以参考:https://www.cnblogs.com/chengyeliang/p/4454290.html其实可以把 i 类比为 时间总的来说就是分两种情况:两个指针在环中同一个位置出发,如果q=2p,那么必定在出发位置相遇;两个指针在环中不同位置出发,如果q = 2p , 那么在 n-k 处相...原创 2019-05-17 23:02:46 · 85 阅读 · 0 评论 -
栈的压入、弹出序列 | 返回栈的最小值
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)此题可以用一个辅助栈,模拟入栈和出栈。每次比较栈当前栈顶元素和弹出序列当前值,如果...原创 2019-06-03 14:47:21 · 213 阅读 · 0 评论 -
调整数组顺序,使得奇数位于偶数前面
这道题本质应该考察排序。在牛客网上看到相关的讨论,用快排的话不稳定,容易改变原始数组的相对顺序。因此用冒泡第一个循环是每一趟,第二层循环是每一趟中,如果相邻两个数是“偶数,奇数”则交换顺序。class Solution {public: void reOrderArray(vector<int> &array) { int n ...原创 2019-05-15 09:33:44 · 165 阅读 · 0 评论 -
删除链表中的重复节点
https://www.nowcoder.com/practice/fc533c45b73a41b0b44ccba763f866ef?tpId=13&tqId=11209&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking在一个排序的链表中,存在...原创 2019-05-09 13:46:52 · 77 阅读 · 0 评论 -
切绳子
具体题目:https://www.luogu.org/problemnew/show/P1577大致意思就是给定几根绳子,切为等长度的几份。长度保留到0.01。思路:暴力的解法就是枚举每个可能的长度。但是由于精确到0.01,因此需要枚举的数量实在太多。采用二分,先排序。二分起始点为0,终点为a[n-1] +1(为何这样设置我其实也有点接受不清)注意当 mid = 0时,break.由...原创 2019-05-05 15:02:33 · 184 阅读 · 0 评论 -
字符数相乘(大数相乘)
https://leetcode.com/problems/multiply-strings/参考解法:https://www.cnblogs.com/grandyang/p/4395356.htmlhttps://blog.csdn.net/kangkanglou/article/details/79894208模拟乘法。每次乘以两个字符。结果的位置坐标是有规律的。当前的结果要加上 ...原创 2019-04-29 15:01:18 · 126 阅读 · 0 评论 -
不用加减乘除做加法
考虑二进制:异或运算,1和0 为1,0和1 为1,1和1 为0,0和0 为0 ,可以看到和加法是一致的。除了进位;进位:可以 令 二者 与 运算再左移1位。因为二者只有在相同的位上同时为1的时候,才进位,进1位,左移1位。得到的结果与异或得到的结果接着进行异或。class Solution {public: int Add(int num1, int n...原创 2019-04-28 18:17:10 · 55 阅读 · 0 评论 -
分糖果、分奖品
首先,LeetCode上有一道分糖果的题目:https://leetcode.com/problems/candy/在网上参考了一个很简单的题解思路,将第一个数的糖果初始化为1,从第二个开始,正向遍历,如果当前数字比前一个大,当前的数的糖果加1。接着反过来从倒数第二个开始,反向遍历,如果当前数字比后一个大,当前的糖果数为max(当前糖果数,后一个糖果数+1)class Solution ...原创 2019-05-03 14:39:46 · 138 阅读 · 0 评论 -
(字符串)模拟规则
有一个程序员写了个自动处理字符串的代码,规则有两条:①如果有aabb型子串,改为aab;②如果有ccc型子串,改为cc。让我们复现程序员的代码。helllowooooooowAABBCC输出:hellowoocAABCC题意是动态的处理。当前处理后,接下来的处理就在此字符串之上。两个规则,对字符串的处理是相同的,当满足任意一个规则时,忽略当前字符串首先定义好两个规则,注意有传入...原创 2019-05-02 01:31:43 · 234 阅读 · 0 评论 -
二叉树的镜像、对称的二叉树、树的子结构
树的子结构: 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)二叉树的镜像:操作给定的二叉树,将其变换为源二叉树的镜像。对称的二叉树:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。三道关于树的题都可以用递归来做,看似很相近有时候一个递归不能解决问题,要用两个。一个满足条件时继续判断...原创 2019-05-24 01:38:10 · 190 阅读 · 0 评论 -
顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.可以按照的方式打印,打印循环的次数可能要注意下计算方法;另外就是注意 两条边重合时,不要重复打印:class Solut...原创 2019-05-24 02:01:10 · 77 阅读 · 0 评论 -
N-皇后1
https://leetcode-cn.com/problems/n-queens/comments/参考:https://www.cnblogs.com/grandyang/p/4377782.html可以定义一个数组,存储当前行放置皇后的列数。递归,所有行,在每一行判断当前列是否发生重复,如果没有重复,尝试放入,继续递归。class Solution {public: ve...原创 2019-06-05 16:46:05 · 81 阅读 · 0 评论 -
n个骰子的点数
参考:https://www.jianshu.com/p/5fc41ff88c3a题目要求:把n个骰子仍在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值的出现概率。思路:n个骰子,所有可能出现的点数和 就是 1~6*n.题目要求的是概率,因此就要求 每种点数可能出现的次数。假设当前 有 m个骰子,那么点数 和为s 的求法就是 m-1个骰子时,s-1,s-6情况的...原创 2019-07-22 11:27:42 · 154 阅读 · 0 评论 -
字符串的翻转
一个是 例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。这道题的解法就是, 先翻转整个字符串,然后依次翻转每个单词注意在 依次翻转每个单词的时候,判断条件的先后顺序:(1)循环终止的条件是 a>=len(2) 先判断 a 时候为 ‘ ’,如果是,则++(3) 接着就是 翻转的...原创 2019-07-17 10:20:27 · 143 阅读 · 0 评论 -
判断平衡二叉树
可以一边计算树的高度,一边判断树是否为平衡二叉树。而不用分开。因为分开的话会有大量重复计算……class Solution {public: bool IsBalanced_Solution(TreeNode* pRoot) { int d = 0; return solve(pRoot,d); } bool solv...原创 2019-07-10 09:56:27 · 86 阅读 · 0 评论 -
只出现一次的数(其它数字出现三次)
https://www.cnblogs.com/grandyang/p/4741122.html对于数的每一位,出现三次,可以通过取余数消掉。那么最终得到的就是只出现一次数的二进制。每次讲sum置位0,并且右移当前位,和1进行与操作,就是当前位应该的取值。每次计算完当前位,要左移到它原来的位置,和结果数 或 操作,就能将当前的位的数放在 结果上。或 运算:1|0 = 01 | 1 =...原创 2019-07-12 19:06:18 · 1242 阅读 · 0 评论 -
最长无重复子字符串
https://leetcode.com/problems/longest-substring-without-repeating-characters/剑指offer上的解法是动态规划,即:f(i)表示当前i位置字符结尾的子字符串的最长无重复结果那么考虑两种情况:(1)当前位置的字符 距离其上一次出现的距离 d 大于当前长度,则说明该字符未出现在当前字符,直接加上当前字符;(2)若&l...原创 2019-07-02 10:31:31 · 182 阅读 · 0 评论 -
整数中1出现的次数(从1到n整数中1出现的次数)
这题O(logn)算法真不好弄啊……参考:https://blog.csdn.net/huzhigenlaohu/article/details/51779365反正分两种情况吧:当前位 == X 或者不等于X不等于X时,大于X 进位;等于X,加上低位+1;a = n / i, b = n%i ;当前位: a%10前半部分 : a/10 , 基数 i后半部分: bcla...转载 2019-06-18 01:42:58 · 132 阅读 · 0 评论 -
把数字翻译成字符串(动态规划)
参考:https://www.jianshu.com/p/80e1841909b7题目要求:给定一个数字,按照如下规则翻译成字符串:0翻译成“a”,1翻译成“b”…25翻译成“z”。一个数字有多种翻译可能,例如12258一共有5种,分别是bccfi,bwfi,bczi,mcfi,mzi。实现一个函数,用来计算一个数字有多少种不同的翻译方法。递推公式:f(i) = f(i+1)+ g(...原创 2019-06-25 15:43:55 · 1462 阅读 · 0 评论 -
最大子列和,二维数组最大子列和
最大子列和:当前的cur<0,表明其对于后面的和增大,故将cur置为0;class Solution {public: int FindGreatestSumOfSubArray(vector<int> array) { int cur=0; int ans = INT_MIN; fo...原创 2019-06-17 01:53:49 · 133 阅读 · 0 评论 -
剑指offer 44 数字序列中某一位的数字
这种数学题好难……参考:(1)https://www.jianshu.com/p/0bbf1fcbe070 理解题意以第15位数字2为例(2隶属与12,两位数,位于12从左侧以0号开始下标为1的位置)步骤1:首先确定该数字是属于几位数的;如果是一位数,n<9;如果是两位数,n<9+90*2=189;说明是两位数。步骤2:确定该数字属于哪个数。10+(15-10)/2...原创 2019-06-20 17:34:03 · 174 阅读 · 0 评论 -
LeetCode LRU
https://leetcode.com/problems/lru-cache/submissions/https://www.cnblogs.com/grandyang/p/4587511.html实现get和putget,如果没有,返回-1;如果有key,表明访问了一次,故将该key移到首部put,将key放入容器,如果有,则应先删除;如果大于容器的容量,将容器的尾部删除。l.s...原创 2019-06-20 09:30:09 · 261 阅读 · 0 评论 -
二叉树从上到下打印,打印多行、之字形打印
两道题思路基本一致,要有一个变量记录当前层节点的数量从上到下打印:(标准的BFS)/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solut...原创 2019-06-02 22:03:39 · 86 阅读 · 0 评论 -
复杂链表的复制、二叉搜索树与双向链表、二叉搜索树的后序遍历、和为某一路径
复制链表的复制题目的意思是,有一个链表,节点除了可以指向下一个节点,还能指向任意节点复制有三个过程:1)每个节点后面加一个节点;2)复制任意节点(新节点在旧节点的基础上向后移动一个位置即可);3)断开/*struct RandomListNode { int label; struct RandomListNode *next, *random; Rando...原创 2019-06-02 21:37:38 · 109 阅读 · 0 评论 -
二叉树的序列化和反序列化
https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree/submissions/可以用递归,比如前序遍历,注意,因为在序列化的时候,当某节点为null,做有标记,因此,在反序列化的时候,可以仍然前序递归,但此时,字符串流的状态要随之更新。/** * Definition for a binary tree ...原创 2019-06-02 21:20:21 · 93 阅读 · 0 评论 -
剪绳子
https://leetcode.com/problems/integer-break/动态规划,O(N^2)算法的话就是 枚举, p[i] = max(p[j]*p[i-j]);注意初始化的p[0-4]是为了后面的计算。贪心的话,基本上就是把N分解为 3 以及最后剩余的数 。 n = 4时,还是4;直观的解释 3(n-3)>2(n-2)> 1*(n-1); (以n=5为例,故...原创 2019-04-17 21:29:11 · 88 阅读 · 0 评论 -
打印从1到最大的N位数
数很大时,long long 也存不下,可以考虑用 字符串。N位数,每个位置上有9中情况,全排列。前面为0的不输出:#include<iostream>#include<string.h>#include<string>#include<cstring>using namespace std;void print_big(cha...原创 2019-04-26 17:42:44 · 110 阅读 · 0 评论 -
二叉树的打印
1、层序打印:用一个队列存储节点即可。需要注意的是 如何判断当前层 节点访问结束,代码中用一个int型变量存储当前层的节点数。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left...原创 2019-02-16 13:26:05 · 262 阅读 · 0 评论