自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

老铁,干了这碗algorithms的博客

每天都被自己菜到

  • 博客(295)
  • 收藏
  • 关注

原创 LeetCode 1938解题报告

1.题意2.方法 方法一.离线算法 + 01Trie 思路与算法 代码实现struct Trie { Trie* left; Trie* right; // cnt表示当前节点出现的次数,在插入和删除节点的时候进行维护,在查询的时候要根据cnt==0判断当前节点是否存在 int cnt; Trie() : left(nullptr), right(nullpt...

2021-07-23 10:08:47 199

原创 第一个只出现一次的字符 哈希 最小的K个数 规定size的堆

第一次只出现一次的字符分析:开辟done数组储存每个字符的出现次数,然后遍历字符串,时间复杂度O(n)//哈希表class Solution {private: int done[60];public: Solution() { memset(done,0,sizeof(done)); } ~Solution() {...

2019-08-14 18:30:49 237

原创 两个链表的第一个公共节点 栈(以空间换取时间) 快慢指针(避免空间消耗)

传送门题目描述输入两个链表,找出它们的第一个公共结点。分析:1.由于是单向链表,所以如果两个链表有公共节点,那么从公共节点向后,一定是两个链表相同的一段节点,我们需要从尾节点开始向前进行遍历,这是栈的特点,我们遍历两个链表,并把节点都储存到栈中,最后从栈顶元素向前比较,直到两个节点的值不一样,那么上一个节点就是第一个公共节点。一定注意程序的鲁棒性,取栈顶元素时必须先检查栈是否为...

2019-08-14 17:58:02 358

原创 数组中出现次数超过一半的数字 多种方法

传送门题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。分析:1.我们首先根据数组特性,出现次数超过一半,意味着我们将数组进行排序后,中间位置的数必然是我们要寻找的数,基于这样的想法首先得到这样的解法,时间复杂度O(...

2019-08-14 09:10:19 348

原创 二叉树中和为某一值的路径 dfs递归搜索 剪枝

传送门题目描述输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)分析:由根节点向叶子节点进行的搜索,注意是树,不需要进行标记,前序遍历即可,注意当前搜索状态//使用dfs来搜索判断/*struct TreeNode { in...

2019-08-13 16:48:24 188

原创 复杂链表的复制 哈希表以空间换时间O(n)

传送门题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)分析:因为链表有两个指针,一个next指针,一个特殊指针,所以我们如果采取暴力的方式,那么我们每次寻找特殊指针的节点都需要O(n)的时间,再配上外面的链表遍历,...

2019-08-13 16:41:48 519

原创 判断序列是否是一棵二叉搜索树的后序遍历序列 思维 递归

传送门题意:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。分析:判断一个序列是否是二叉搜索树的后序遍历,首先由二叉搜索树的性质得知,二叉搜索树的左子节点都比父亲要小,而右子节点都比父亲要大,这时结合后序遍历的特点:左右根,所以我们的策略就是:首先得到一个序列中最后一个元素,当作根,那么接下来寻找左右...

2019-08-12 23:29:18 242

原创 按之字形顺序打印二叉树 bfs

传送门分析:其实就是一个bfs,只不过输出的时候,第一行按照从左到右,第二行从右到左,第三行和第一行同理,依次类推注意构造函数,析构函数和防御性编程/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : ...

2019-08-12 17:39:23 84

原创 栈的压入,弹出序列 辅助栈 思维

传送门分析:借助辅助栈,遍历出栈序列的时候,每一个元素要么在辅助栈的栈顶,要么还没有入栈,这时从入栈序列中找到这个值,并把它前面的元素全部入栈,这时它作为栈顶,符合出栈序列,如果遍历结束入栈序列还未找到这个值,那么出栈序列不符合要求,返回false。注意防御性编程,当两个序列为空指针时的情况,长度不同的情况等等注意第22行的条件,调试的时候出错。//设置辅助栈 创建两个指针,...

2019-08-12 16:56:27 135

原创 包含min函数的栈 思维 借助额外的辅助栈以空间换时间

传送门分析:要求时间复杂度push,pop,min都是O(1),我们可以把每次的最小元素(之前的最小元素和新压入栈的元素两者的较小值)都保存起来放入另一个辅助栈中。如果每次都把最小元素压入辅助栈,那么能保证辅助栈的栈顶一直都是最小元素,当最小元素从数据栈内被弹出之后,同时弹出辅助栈的栈顶元素,此时辅助栈的新栈顶元素就是下一个最小值。//建立一个额外的栈,用空间换取时间class So...

2019-08-12 16:06:26 94

原创 顺时针打印矩阵 循环 标记 试探下一位

传送门循环,注意循环边界条件//设置标记数组,永远关心下一位const int maxn = 100+5;class Solution {private: bool done[maxn][maxn];public: Solution() { memset(done,false,sizeof(done)); } ~Soluti...

2019-08-12 10:45:53 137

原创 对称的二叉树 巧妙改变遍历顺序 特别注意所有节点值都相等的情况(这时要把空指针也加入序列)

传送门题意:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。分析:通常我们有3种不同的二叉树遍历算法,即前序遍历,中序遍历和后序遍历,在这3种遍历算法中,都是先遍历左子节点再遍历右子节点,针对这道题,我们是否可以定义这样一种遍历算法,先遍历右子节点再遍历左子节点?即先遍历父节点,再遍历它的右子节点,最后遍历它的左子节点。这样如果...

2019-08-12 10:13:29 323

原创 二叉树的镜像 树的遍历

传送门题意:操作给定的二叉树,将其变换为源二叉树的镜像。二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5其实...

2019-08-12 09:09:52 338

原创 树的子结构 递归

传送门题意:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)注意:在操作树的时候,我们一定要注意边界条件的检查,即检查空指针,当树A或树B为空的时候,定义相应的输出。如果没有检查并进行相应的处理,则程序非常容易崩溃。同时,还有一个细节值得注意:本题中节点中值的类型为double,在判断两个节点的值是不是相等的时候,不能直接使用==来进行...

2019-08-12 08:14:17 105

原创 链表中环的入口节点 标记(图思路) || 双指针(不需要额外空间)

传送门分析:标记(图思路):使用图判环的方式,对链表中每一个节点进行标记,如果访问已经标记的节点,那么环就得到解双指针:使用快慢指针判环,接着使用遍历进行环的节点计数,最后使用相距n个节点的双指针遍历链表,当两个指针指向同一个链表节点,那么得到链表环的入口节点。特别注意Meeting函数中两个指针空指针造成程序崩溃的问题。图思路://链表中判断环路,联想图的判环方式/*s...

2019-08-11 22:11:16 245

原创 反转链表 栈 三指针

传送门分析:本题主要考察程序的鲁棒性,主要注意一些特殊测试,例如:当输入的链表头指针为nullptr或者整个链表只有一个节点时,或者反转后的链表可能出现断裂思路主要有两种:1.借助一个栈来实现,比较直观2.三指针的做法,我们每次只进行相邻两个节点的反转,同时记录下一个节点指针,这是因为如果不记录下一个节点指针,我们将无法访问原链表,这样迭代进行。三指针的做法,由于是原地进行,所...

2019-08-11 18:15:29 345

原创 链表中倒数第k个节点 栈 双指针 扩展:寻找链表的中间节点

传送门分析: 首先,这道题考察了程序的鲁棒性,主要是关于空指针以及k的取值问题 第一种思路:可以使用一个栈来实现,由于栈是后进先出的一种数据结构,我们可以将遍历链表的节点存储到栈中,接着弹栈k次即可得到倒数第k个节点。 第二种思路:双指针 我们考虑设置两个指针,开始时都指向头结点,第一个指针向前移动k-1次,这样它就...

2019-08-11 08:56:06 182

原创 表示数值的字符串 模拟

传送门//判断一个字符串是否能顾表示一个数值//模拟class Solution {private: int done[10];public: Solution() { memset(done,0,sizeof(done)); } ~Solution() { } //判断小数部分是否合法...

2019-08-10 11:23:07 87

原创 单向链表删除节点两种方式 删除链表中重复的节点 注意边界特殊情况

1.单向链表删除节点两种方式通常对于单向链表,有两种删除方式: 1.记录前面的一个节点,把被删除节点的后继设为前驱节点的下一个节点,但是要注意头结点的问题 时间复杂度为O(n) 2.不需要记录前驱节点,我们只需要把被删除节点的后继节点的内容复制到被删除节点中,然后删除这个后继节点,时间复杂度为O(1),同第一种方式一样,当删除的是尾节点的时候,不能采用这种方式,...

2019-08-10 09:40:45 1235

原创 二叉树中序遍历的下一个节点

传送门中序遍历为左根右的顺序思路:如果这个节点有右子树,那么右子树的最左下节点就是解 否则,如果没有右子树,那么看它有没有父亲节点,如果没有父亲节点,那么这个节点无后继,反之,我们首先观察它是不是父亲节点的左子树,如果成立,那么父亲节点就是后继,如果该节点是父亲节点的右子树,那么我们需要一直向上看,直到找到一个父亲节点是左子树,那么这个父亲节点的父亲节点就是解,如果...

2019-08-09 09:22:36 343

原创 剑指Offer 调整数组顺序使奇数位于偶数之前 思维 排序

传送门题意:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。分析:首先想到了快速排序,进行一次快排便可以达到目的,使用两个指针遍历的方法,但是题目要求奇偶相对顺序不发生改变,这时由于快排是不稳定的排序方法,不满足题意,于是排除掉快速排序的思路。 接...

2019-08-08 09:10:08 100

原创 Leetcode Add Two Numbers 链表 大数加和模拟 (特别注意链表的指针操作)

传送门/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: strin...

2019-08-06 09:54:55 121

原创 Leetcode Two Sum 二分 multimap 使用make_pair插入元素,不可以直接赋值

传送门注意map进行值插入的两种方式,一种直接赋值,这时如果有这个键,那么值会覆盖掉原来的值,如果使用make_pair进行插入,那么会首先检查有没有这个键,如果有这个键,那么插入元素不会成功,当然值也不会形成覆盖。class Solution {public: vector<int> twoSum(vector<int>& nums, int ...

2019-08-06 09:50:10 361

原创 Leetcode 第 148 场周赛

传送门1.递减元素使数组呈锯齿状 暴力分析:暴力,依次按照两种方式进行遍历即可class Solution {public: int movesToMakeZigzag(vector<int>& nums) { //依次尝试两种方法 int ans = 0, ans1 = 0; vector<i...

2019-08-06 09:23:31 118

原创 二叉树指针实现 根据中序和前序/后序得到一棵树 并进行前中后序遍历以及层序遍历 并判断完全,完满,满二叉树

//输入前序和中序得到整棵树,并进行前中后序遍历以及层序遍历#include<bits/stdc++.h>using namespace std;const int maxn = 1000+5;struct BinaryTreeNode{ int T_Value; BinaryTreeNode* T_Left; BinaryTreeNode* T_Ri...

2019-08-02 09:08:03 177

原创 关于对c++中->以及.的理解 && new delete的使用

首先是‘.‘和’->‘的理解:.主要用于访问类的成员,->主要用于类类型的指针访问类的成员,而.运算符,主要用于类类型的对象访问类的成员。举例:class A{public :int a}A ma;A *p=&ma;那么指针p应使用->来访问成员a,比如p->a,而ma应使用.来访问,比如ma.a区别就在这里,凡是指针就使用->,对象就使用...

2019-08-01 23:35:24 94

原创 链表指针实现 从尾到头打印链表(使用栈来实现)

#include<bits/stdc++.h>using namespace std;struct ListNode{ int m_Value; ListNode* m_Next;};//删除链表中某个节点void RemoveNode(ListNode** pHead,int value){ if(pHead==nullptr||*pHead=...

2019-08-01 23:30:15 272

原创 剑指Offer 面试题 21 调整数组顺序使奇数位于偶数前面 一次快排 以及对swap库函数地址传递的探索

题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。分析:解法一:如果对空间复杂度的要求不高,那么我们可以额外开辟一段内存空间,同时设置两个位于开始和末尾的指针,遍历 原数组,遇到奇数就让开始指针向后移动一位,遇到偶数就让结束指针向前移动一位,直到两个指针相遇。 解法二:如果要求空间复杂度为 O(1)...

2019-08-01 09:58:26 160

原创 剑指Offer 面试题11 旋转数组的最小数字 思维&&二分

旋转数组:把一个数组最开始的若干个元素搬到数组的末尾,称之为数组的旋转,本题中数组为递增的有序数组 直观解法:遍历整个数组,寻找最小值,时间复杂度O(n) 二分解法:设置两个index,分别指向数组开始和末尾,midindex = (index1+index2)>>1,根据公式得到中间索引,由题意直到递增数组的一个性质,开始的元素必然大于或者等于末尾的元素(注意...

2019-07-30 09:00:28 124

原创 hdu 6608 米勒罗宾&&威尔逊定理&&逆元

hdu 6608求阶乘对一个大质数取模威尔逊定理:当p是质数时,满足 注意米勒罗宾的写法,小心溢出#include<bits/stdc++.h>using namespace std;typedef long long LL;const int Times = 15;LL multi(LL a,LL b,LL mod){ LL ans=0; ...

2019-07-29 22:01:21 203

原创 堆内存&&栈内存&&静态存储区

参考博客:https://blog.csdn.net/qq_41498261/article/details/83583466https://www.cnblogs.com/jiudianren/p/5671992.html一般说到内存,指的是计算机的随机存储器RAM,程序都是在这里面运行。1.栈内存:栈内存由操作系统自动分配和释放,速度快,使用方便,但程序员无法控制。若分配失败,...

2019-07-27 10:22:02 157

原创 Java 垃圾回收处理机制 jvm的分配担保机制

参考博客:https://blog.csdn.net/csdnnews/article/details/97065881https://blog.csdn.net/weixin_40369899/article/details/88943946一. 首先,我们要明确什么是要处理的垃圾 两个算法:引用计数和可达性分析算法; 引...

2019-07-26 09:44:43 861

原创 快速排序 确定主元以及随机化 三路快排

快速排序时间复杂度为O(nlogn),由于每次主元所在次序并不一定是在数列中央,所以复杂度并不是确定的。特殊的,当原数组排序程度越高的时候,快速排序时间复杂度会退化,当原数组完全有序时,快速排序时间复杂度退化成O(n^2) 确定主元排序:#include<bits/stdc++.h>using namespace std;const int maxn = ...

2019-07-23 09:04:47 615

原创 Java----网络编程 udp 实现一个基于udp协议的简单聊天功能

udp面向非连接,是一种传输层协议,提供面向事务的简单不可靠信息传送服务,例如视频聊天,游戏卡顿由传输层到达应用层需要套接字 Socket手写了一下模拟udp传输协议注意端口不能重复发送端:package cn.net.java.mhz;import java.net.DatagramPacket;import java.net.DatagramSocket;imp...

2019-07-14 18:25:25 373

原创 python 观察者模式

参考博客 https://www.cnblogs.com/Xjng/p/4038931.html 在制作自己的音乐播放器的时候遇到这个问题,我需要键盘监听来得到用户的输入来判断程序是暂停播放还是切换下一首歌亦或是进行倍速播放,本来是打算使用多线程来解决的,可是经过认真仔细的考虑,从cpu的角度看,多线程只是线程占用了不同的时间片而已,单位时间内还是只能有一个线程执行操作,但是如...

2019-07-06 11:42:30 249

原创 synchronized同步方法和同步块 double精度问题

贴两篇博客:https://blog.csdn.net/TesuZer/article/details/80874195https://blog.csdn.net/feicongcong/article/details/77149243最好的方法就是转成BigDecimal高精度类型具体请移步:https://blog.csdn.net/qpzkobe/article/detail...

2019-07-01 18:21:47 206

原创 Java---个人编程错误收集---01

1.错误信息:Local variable num defined in an enclosing scope must be final or effectively final引用自:https://blog.csdn.net/sf_climber/article/details/78326984报错代码:package cn.MulThreadOthers.java.mhz;...

2019-06-26 17:50:58 325

原创 Java---多线程04

1.volatile----轻量级的synchronized锁 ,锁的是数据,保证线程之间变量的可见性,简单地说就是当线程A对变量x进行了修改之后,在线程A后面执行的其他线程能看到变量x的变动,volatile保证了数据永远是最新的,更详细地说是要符合以下两个规则: F.线程对变量进行修改之后,要立刻回写到主内存 S.线程对变量进行读取的时候,要从主内存中读取,而不是缓存...

2019-06-26 16:34:10 94

原创 Java---多线程03

1.死锁以及避免死锁线程同时含有多个对象的锁,那么当多个线程同时开启时,有可能造成死锁,过多的同步可能会造成相互不释放资源,从而相互等待,一般发生于同步中持有多个对象的锁解决死锁:避免在一个代码块中同时持有多个对象的锁static和final1、final可以修饰:类变量、成员变量、局部变量、方法、类。1.1、被final修饰的变量:必须直接赋值,并且不再允许在其他地方改值。...

2019-06-23 11:34:01 121

原创 Java---多线程02

1.礼让yieldyield暂停线程,使得当前执行的线程由运行状态直接转入就绪状态,然后交由cpu重新调度package cn.MulThread.java.mhz;/** * 礼让yield * yield暂停线程 * @author MHZ * 礼让线程,让当前正在执行的线程暂停,不是阻塞状态,而是将线程从运行状态直接转入就绪状态,让cpu重新调度,公平竞争,注意是直接进入...

2019-06-21 16:06:16 156

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除