自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(23)
  • 收藏
  • 关注

原创 二叉树的层序遍历与深度优先遍历

二叉树的层序遍历主要用的是队列,思路很简单。class Solution {public: vector<vector<int>> levelOrder(TreeNode* root) { if(root==NULL) return vector<vector<int>>(); vector<vector<int>> res; queue<TreeNode*> Q.

2021-08-02 11:16:12 254

原创 小顶堆解决TopK问题

解题思路:小顶堆顶部存储的是较小的值,从下到达排序的叫小顶堆;我们在小顶堆里面存储够k个元素对应的频次即可;class mycomparison{ public: bool operator() ( pair<int,int>& lhs,pair<int,int>& rhs) { return lhs.second>rhs.second;//小顶堆,这里要注意,小顶堆的定义方式是">" .

2021-07-30 16:01:37 298

原创 类的静态方法

静态的内存空间是固定的,相对来说更省资源。创实例的创一个实例就要开辟一个新内存,耗费资源静态方法属于类所有,类实例化前即可使用;非静态方法可以访问类中的任何成员,静态方法只能访问类中的静态成员;因为静态方法在类实例化前就可以使用,而类中的非静态变量必须在实例化之后才能分配内存;static内部只能出现static变量和其他static方法!而且static方法中还不能使用this等关键字,因为它是属于整个类;静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁;静态

2021-07-09 17:01:05 2011

原创 带左右边界查找的例子-搜索有序数组中第一个出现和最后出现这个元素的位置

首先我们来理解一下这个问题,什么是左边界,什么是右边界;给定一个数组: nums=[5,7,7,8,8,10]; target=8;左边的元素是[5,7,7],右边的元素是[10].那么这个左边界的意思是,<target的元素有多少个,而<target的数字的个数正好是第一次出现这个元素的位置;同理右边界可以怎么做呢,就是说最后一次出现这个target元素在什么位置。在这里插入代码片class Solution {public: vector<int> searchRan

2021-06-24 16:11:20 141

原创 旋转数组的二分查找

这题是一道二分查找的变形题,数组在一个区间内有序;那么思路很简单,找到这个边界,如果在0~k范围内找到了,就在这个区间内二分查找,如果在[k+1,end]内找到了,就在这里二分查找,如果在范围外,返回-1;四路上很简单,细节上要注意的问题很多;class Solution {public: int search(vector<int>& nums, int target) { if(nums.size()==1&&nums[0]!=targ.

2021-06-24 10:43:54 159

原创 链表中的快慢指针问题

快慢指针可以巧妙的解决链表中的一些问题,典型的有(1)判断链表中有没有环(2)已知这个链表中含有环,返回环的起始位置(3)链表的中点位置(4)链表的倒数第n个结点首先分析第一个问题:来设想这样一个场景,给一个四百米跑道,龟兔赛跑,兔子跑的贼快,速度是乌龟的两倍,在这种情况下,是不是总有一个时刻,乌龟和兔子处在同一个位置,但是兔子比乌龟多跑了一圈。bool hascycle(ListNode* head){ ListNode fast,slow; fast=head; slow=head

2021-06-23 15:48:43 189

原创 滑动窗总结

滑动窗口的逻辑比较简单,但是细节比较复杂,其中最难的地方在于如何判断左边窗口缩小的时机和在何处更新答案下面对活动窗口的逻辑做一个综述;(1),定义两个map,用作两个计数器,一个用来计算目标串的信息,另一个用来计算窗口串的信息,分别记作need和window。(2) 定义左右指针和valid变量,用来记录窗口中符合要求的时机。当valid==need.size()的时候就要收缩左侧指针,例如leetcode第76题。(3)逻辑在于,现在字符串中找到一个可行解,当找到这个可行解的时候就收缩左侧指针,

2021-06-23 10:51:38 99

原创 二分查找总结

二分查找二分查找是一种我们在初中就学过的效率较高的用对数级别的时间复杂度进行遍历的算法,关于这个算法,有很多细节的地方需要注意,参考labuladong老师的《算法小抄》 现总结如下:1:找目标值的二分查找例如:nums=[1,2,3,4,5,6,7];target=3;求:target的索引值。那么这个问题,有两个方法,1:暴力遍历,时间复杂度是O(n)for(int i=0;i<nums.size();i++){ if(nums[i]==target) { return

2021-06-22 11:48:35 67

原创 热插拔导致的文件损坏问题解决办法

学习工作中有很多时候会移动硬盘的热插拔,移动硬盘又非常脆弱,容易导致以下错误:“目录或文件损坏,无法打开。。”针对这个错误在windows下可以用:chkdsk文件来修复;具体用法可以用help chkdsk来查询,一般解决用 chkdsk $盘符:[选项],很好用...

2021-06-09 19:29:51 1406

原创 01背包问题的一维数组写法及总结

#include<iostream>#include<vector>using namespace std;void test_1dimension_wei_bag_problem(){ vector<int> weight = { 1,3,4 }; vector<int> value = { 15,20,30 }; int bagweight = 4; vector<int> dp(bagweight + 1, 0); for

2021-06-02 10:51:08 449

原创 详解01背包问题

//二维dp数组01背包/*1:确定dp数组以及下标的含义,对于背包问题,有一种写法,是使用二维dp数组,集dp[i][j]表示的含义是以i为结尾的物品,放进容量为j的背包,价值综合最大是多少2:确定递推公式对于每个物品,都有拿或者不拿两个状态(1)如果不拿,dp[i][j]=dp[i-1][j](2)如果拿:dp[i][j]=dp[i-1][j-weight[i]+value[i]所以递推公式:dp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]+valu

2021-06-01 22:18:02 201

原创 LeetCode560题:折腾了好长时间的一道题:和为K的子数组

这题是一道经典的前缀和,前缀和其实就是数列里面的前N项和;要找K=2的连续子数组,可以是nums[0]+nums[1],也可以是nums[2]+nums[3],但是nums[2]+nums[3]可以写成nums[1]+nums[2]+nums[3]-nums[1],即前两项和(从0开始计数)-前0项和;这道题的思路就是计算前N项和存入一个表中,定义:unordered_map<int,int> map1,存前n项和以及前n项和出现的次数(因为可能有负数导致前i,j项和相等)这样我们每次查找一个前

2021-05-16 16:38:07 160

原创 位运算求一个整数中有多少个二进制1

如何快速判断一个整数中有多少个二进制1思路:首先我们把这个数减去1,然后和这个数做与运算,这样可以把这个数的最右边一个1变为0;对应leetcode 461题 《汉明距离》例如:0101 -->0100 0101&0100=0100;然后重复此操作(2)0100 ----->0011 0100&0011=0000;结束;#include<iostream>using namespace std;int main(){

2021-04-27 20:39:20 131

原创 树的基本概念和性质及其操作

树的基本概念和性质及其操作结点:树的数据元素***结点的度:有几个直接后继就是几度,亦称次数结点的层次:中断结点:从根到该结点的层数(根结点算第一层)分支结点:度为0的结点,即叶子结点***树的度:所有结点度中的最大值***树的深度:所有结点中最大的层数由于树中,每个根结点的后继结点不确定,对于结点的存储关系难以确定,导致直接研究树是一个很难得问题,问题解决得办法在于,所有的树都可以转换成二叉树,二叉树在所有的树中是最简单的,他的存储和恢复也相对比较简单,所以我们直接转为研究二叉树;二

2020-11-20 16:44:34 293 1

原创 队列的链式存储

队列的链式存储队列也是一种特殊的线性表,队列相比于链表,是在链表的一端插入元素,另外一端取出元素,遵循“先进先出”的原则,与栈相反,队列的存储也用到了链表的API函数//头文件1-链表的api函数及定义的节点#ifndef _MYLINKLIST_H_#define _MYLINKLIST_H_typedef void LinkList;typedef struct _tag_LinkListNode{ struct _tag_LinkListNode* next;}LinkListNo

2020-11-17 17:21:52 188

原创 栈的应用-中缀转后缀表达式及其计算

栈的应用-中缀转后缀表达式及其计算中缀转后缀表达式及其计算是栈的另外一个典型应用,中缀表达式例如:8+(3-1)*5,这是我们习惯的表达方式,但是计算机不是这么算的,计算机首先把他转成后缀表达式,然后根据后缀表达式进行计算;中缀转后缀表达式的算法流程#include<iostream>using namespace std;#include"LinkStack.h"int isNumber(char c)//判断是否是数字{ return ('0' <= c) &&

2020-11-17 10:00:25 126

原创 栈的应用-括号的就近匹配

栈的应用-括号的就近匹配代码块中,编译器通常会帮我们做符号等一些语法检查,提示在哪些地方语法错了,其中符号的就近匹配是用栈做的;思路和代码如下://就近匹配是对栈的应用,程序中对括号的“就近匹配”用到的就是栈的思想//1.从第一个字符开始扫描;2.当遇见普通字符的时候忽略;3.当遇见左符号的时候压栈;4.当遇见右符号时从栈顶弹出符号,并进行匹配// 匹配成功:继续读入下一个字符// 匹配失败:立即停止并报错//结束:// 成功:所有字符扫描完毕,且栈为空// 失败:匹配失败或所有字符扫描完

2020-11-16 16:09:58 125

原创 链式栈的实现

链式栈的实现栈相比于链表,它是一种特殊的数据模型,两者既有联系(通过链表的api函数可以改造出栈的api函数,这其中的原因在于两者的底层逻辑是有相似的地方的,即:通过在链表的头部操作元素,就可以模拟出栈),区别在于,链表和栈之间的对变量生命周期的管理不一样;在实现栈的过程中,我们不可避免的用到了链表的api函数;//头文件1:栈的头文件,定义了数据类型和栈的api函数#define _MY_LINKSTACK_Htypedef void LinkStack;//把栈节点适配成链表节点,添加进链表库

2020-11-16 11:43:44 185

原创 双向链表实现

双向链表的实现双向链表的应用背景主要是单向链表只能顺序访问,逆序访问单向链表(尤其是较大的单向链表是一件极其费时费力的工作),相比于单向链表,双向链表增加了一个域,这个域里面增加了一个指向前驱节点的指针,使得整个链表可以顺序访问或者逆序访问,来去自如;//定义的双向链表的头文件,里面包含了双向链表的声明和数据类型的定义;#ifndef _MY_DOUBLELIST_H#define _MY_DOUBLELIST_Htypedef void DLinkList;typedef struct _t

2020-11-03 10:50:49 106

原创 循环链表的C语言实现及其在约瑟夫问题上的应用

循环链表的实现及其约瑟夫问题的求解单向链表只能通过前驱结点找后继结点,一旦丢失一个结点,那后面的结点都无法找到,循环链表将链表尾部的next域指向链表头部的元素,形成一个闭环,通过中间的任意一个元素都可以找到链表中的某个元素,循环链表的api函数有两个难点,难点一在于头插法的链表插入,我们看图说话:约瑟夫问题:关于约瑟夫问题的基本解释,可以问度娘,大概意思是,有一个封闭的环,从一开始数,数到第三个,那个数字就被删除,一直循环到所有的数字都出去就算完成;#ifndef _CIRCELIST_H_#

2020-10-22 20:29:59 137

原创 C++实现链表

c++实现链表前面已经用c语言实现了传统链表和企业链表,其实不管是用c++还是c语言,实现链表的核心思路都是一样的,根本的区别在于语法上,以及在一些变量的生命周期管理上稍有差异;//c++LinkList.h#pragma once#include<iostream>using namespace std;template <typename T> struct Node{ T t;//缓存t元素 struct Node<T>* next;};

2020-10-06 21:00:34 367

原创 c语言实现企业链表

c语言实现企业链表我们最早学习的线性表分为顺序表和链表,顺序表即用数组来模拟链表,他的内存是连续的;缺点在于事先要知道大小,但是实际生活中我们并不能实现准确的预知对象有多大,需要多少内存。因此就诞生了链式存储的顺序表,即链表;链表也是分为三种,传统链表、内核链表,和企业链表。那么这三种链表分别有什么特点呢?(1)传统链表:传统链表区别于数组模拟的线性表,可以不用管到底需要多大的内存,比较方便。第二个特点是他的内存不是连续的,每个结点包含一个数据域和指针域。每个节点的指针域保存的是下一个节点的地址。他的缺

2020-10-05 19:50:35 277 1

原创 2020-09-23

第一篇博客从今儿开始就在这里记录自己的学习过程啦,加油啊,坚持

2020-09-23 16:26:14 37

空空如也

空空如也

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

TA关注的人

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