自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JZ40 最小的K个数

3.书中解题,多重哈希表,哈希表从大到小排序,依次往哈希表插入k个元素,如果哈希表有了k个元素,往后每遍历一个值,把0号元素(最大值)和当前元素进行对比,0号元素比进来的元素小,删除0号元素,插入当前元素。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4(任意顺序皆可)。2.维护一个K个节点的大根堆,对于[k,n-1]之间的元素,每次拿堆顶元素和当前元素对比,交。输入:[4,5,1,6,2,7,3,8],4 返回值:[1,2,3,4]

2024-08-26 04:12:04 317

原创 JZ13 机器人的运动范围

但是,它不能进入方格 [35,38] ,因为 3+5+3+8 = 19。if thresold = 3, 能走的路径:00 01 02 03,10,11 ,12,20 ,21,30, row+col <=3。if thresold = 8,能走的路径: 00~08, 10~17, 20~26,30~35,40~44, row+col<=8。row = 10, col = 11 ------>数位和:1+0+1+1 = 3。数位和:123456----->1+2+3+4+5+6,

2024-08-26 03:31:31 467

原创 JZ12 矩阵中的路径

如果树的叶子节点不满足约束条件,那么只好回溯到它的上一个节点再尝试其他选项,如果上一个节点的所有可能的选项都试过了,并且不能满足约束条件的终结状态,再回溯到上一个节点。如果所有节点的所有选项都已经尝试过仍然不能满足约束条件的终结状态,则该问题无解。剑指Offer --p88。用回溯解决的问题的所有选项可以形象地用树结构表示,在某一步可能有n个可能的选项,那么该步骤可以看成是树状结构中的一个节点,每一个选项看成树中节点连接线,经过这些连接线到达该节点的n个子节点,树的叶子节点对应着终结状态。

2024-08-25 17:14:38 292

原创 JZ58 左旋转字符串

例如,字符序列 S = ”abcXYZdef” , 要求输出循环左移 3 位后的结果,即 “XYZdefabc”数据范围:输入的字符串长度满足 0≤len≤100 0≤len≤100 , 0≤n≤100 0≤n≤100。3.对str.begin()至str.end()-n这一区间进行翻转。-------->对fedZYX进行翻转。2.对倒数第n个字符至str.end()这一区间进行翻转------>对cba进行翻转。进阶:空间复杂度 O(n) O(n) ,时间复杂度 O(n) O(n)

2024-08-25 01:56:03 394

原创 JZ273 翻转单词序列

牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“nowcoder. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a nowcoder.”。进阶:空间复杂度 O(n) O(n) ,时间复杂度 O(n) O(n) ,保证没有只包含空格的字符串。2.遍历字符串,找到每个单词的初始下标和终止下标,翻转每个单词。1.先翻转整个字符串。

2024-08-25 01:39:01 267

原创 JZ39 数组中出现次数超过一半的数字

用一个计数器count来统计这个超过一半的数res,如果当前元素是res,++count,如果不是,--count, 在count==0的时候,更新res.例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

2024-08-22 01:51:52 209

原创 JZ78 把二叉树打印成多行

给定一个节点数为 n 二叉树,要求从上到下按层打印二叉树的 val 值,同一层结点从左至右输出,每一层输出一行,将输出的结果存放到一个二维数组中返回。2.队不空的时候进入循环,如果当前结点有左孩子,左孩子入队,plast保存,右孩子不空,右孩子入队-plast保存。1.根节点入队,pcur当前结点,plast每次保存入队结点,prelast保存每一层的最后一个结点。3.如果当前结点pcur==prelast,保存结果该行结果。

2024-08-22 00:41:03 205

原创 JZ68 二叉搜索树的最近公共祖先

1.对于该题的最近的公共祖先定义:对于有根树T的两个节点p、q,最近公共祖先LCA(T,p,q)表示一个节点x,满足x是p和q的祖先且x的深度尽可能大。如果root > p && root > q: 去右子树找到 第一个p < root

2024-08-22 00:19:12 381

原创 Jz79 判断是不是平衡二叉树

(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且。输入一棵节点数为 n 二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树。

2024-08-21 23:29:52 267

原创 Jz54 二叉搜索树的第K个结点

根据二叉搜索树的性质,我们可以尝试递归中序遍历,也就是从最小的一个节点开始,找到k个就是我们要找的目标。给定一棵结点数为n 二叉搜索树,请找出其中的第 k 小的TreeNode结点值。2.不能查找的情况,如二叉树为空,则返回-1,或者k大于n等等,也返回-1。二叉搜索树值的特点:left < mid < right。1.返回第k小的节点值即可。3.保证n个节点的值不一样。

2024-08-21 23:28:15 256

原创 JZ76 删除链表中重复的结点

例如,链表 1->2->3->3->4->4->5 处理后为 1->2->5。2.然后遍历set容器,再把链表出现在set中的容器删掉。

2024-08-20 04:03:25 235

原创 JZ55 二叉树的深度

对应leetcode 104题,层序遍历对应leetcode-102自顶向下,leetcode-107自底向上。递归代码太简单-一行就可以,可以用二叉树的层序遍历,顺便温习下二叉树层序遍历的写法。

2024-08-20 03:18:28 192

原创 JZ52 两个链表的第一个公共结点

i到达list1终点后继续去遍历list2, j到达list2的终点后继续去遍历list1, 第二次遍历两个游标肯定在第一个公共结点相遇。剑指offer P253解题思路1:两个链表全部入栈,然后对比栈顶结点,如果相同,同时弹出,直到找到最后一个相同结点。思路3:用双指针,遍历这两个链表,用一个游标i去遍历list1, j 去遍历list2,解题3:游标走完一个链表然后去走第二个链表,只走一次,需要设置标志位。先让长的链表走K步,然后再同步走,第一个相同的结点就是公共结点。2.长的链表先走k步。

2024-08-19 12:15:34 325

原创 JZ51 数组中的逆序对

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。先把数组分割成小小数组,统计出数组内部的逆序对的数目,然后再统计出两个相邻数组之间的逆序对数目。在统计逆序对的过程中,还要对数组进行排序。要求:空间复杂度 O(n)O(n),时间复杂度 O(nlogn)O(nlogn)数组中所有数字的值满足 0≤val≤1090≤val≤109。时间复杂度:用到归并排序O(nlogn),空间复杂度O(N)题目保证输入的数组中没有的相同的数字。

2024-08-19 11:36:55 357

原创 JZ22 链表中倒数最后k个结点

【代码】JZ22 链表中倒数最后k个结点。

2024-08-18 04:45:22 240 1

原创 JZ21 调整数组顺序使奇数位于偶数前面(一)

输入一个长度为 n 整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

2024-08-18 04:27:41 249

原创 JZ20 表示数值的字符串

例如,字符串["+100","5e2","-123","3.1416","-1E-16"]都表示数值。但是["12e","1a3.14","1.2.3","+-5","12e+4.3"]都不是数值。-如果没有E或者e不会走这个语句------?---匹配0或者1个括号里面的。6.^--以xxx开头,$-以XXX结尾----可有可无,没有也可以编译通过。-d+:1一个或者多个数字---有E后面肯定有数字。---0个或者1个+或--[Ee]---只匹配一个。0个或者1个+或者-

2024-08-18 03:46:28 195

原创 JZ18_删除链表的结点

3.该题只会输出返回的链表和结果做对比,所以若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点。给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。2.题目保证链表中节点的值互不相同。1.此题对比原题有改动。

2024-08-18 02:03:16 181

原创 JZ14_剪绳子

因此,当 j 固定时,有 dp[i]=max(j×(i−j),j×dp[i−j])。dp[i]: 将整数i拆分成至少两个整数的和之后,这些整数最大的乘积,每个正整数对应的最大乘积取决于比它小的正整数对应的最大乘积。将 i 拆分成 j 和 i−j 的和,且 i−j 继续拆分成多个正整数,此时的乘积是 j×dp[i−j]将 i 拆分成 j 和 i−j 的和,且 i−j 不再拆分成多个正整数,此时的乘积是 j×(i−j);JZ14和leetcode343整数拆分得到的乘积最大基本是一道题。

2024-08-18 01:45:18 323

原创 JZ16 数值的整数次方

只需要判断exponent是否为负整数就行。

2024-08-18 01:20:08 141

原创 JZ15_二进制中1的个数

如果i的最低为为0, 那么dp[i] = dp[ i >> 1];//i的最低为为0,二进制数量和 i 右移1位是一样的。如何判断某个数的最低位是1还是0?-------> n & 1 == 1---最低位为1, n&1 == 0最低位为0。如果i的最低位为1, 那么dp[i] = dp[i-1] + 1;dp[i]: 数字 i二进制中含有1的个数。n&(n-1):消除最低位的1.对应leetcode_338。

2024-08-18 01:06:05 196

原创 JZ11_旋转数组的最小数字--有重复值

2.对于有重复的数字-有一种特殊情况,如果nums[left] = nums[mid]= nums[right],无法知道最小值在哪个区间,需要切到顺序查找。1.旋转数组的最小数字-无重复值代码实现-leetcode-153。

2024-08-18 01:00:05 186

原创 JZ9_两个栈实现一个队列

2.2 如果stack1不为空,但是stack2为空:把stack1依次出栈的元素push到stack2,然后再让stack2出栈。2.3.如果stack2是不为空的,直接从stack2出栈。1.用一个栈进行正常的入队,无脑pushback即可。2.1 如果两个栈都为空,返回-1;2.出栈的时候,有三种情况。

2024-08-18 00:53:32 211

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

思路:给定一个结点pNode,它的中序遍历的下一个结点有可能是它的父亲,因此,需要自底向上地将比它辈分高的结点全部先入栈。当出栈结点等于pNode的时候,说明下一个出栈结点就是所要求的结果。给出某二叉树的中序遍历的某个结点,求其下一个结点,其中二叉树除了有left、right指针指向左右孩子,还有一个next指针指向其父亲。-b1.遍历当前结点,把其左孩子全部入栈。-b3.pCur指向栈顶结点的右孩子。b.在pCur不为空或者栈不为空的时候进入循环。2.求二叉树中序遍历的下一个结点。

2024-08-18 00:48:59 209

原创 JZ7_用前序遍历和中序遍历重建二叉树

【代码】JZ7_用前序遍历和中序遍历重建二叉树。

2024-08-18 00:32:48 117

原创 JZ6_从头到尾打印链表

【代码】JZ6_从头到尾打印链表。

2024-08-18 00:24:27 385

原创 JZ5_替换空格

数据范围:0≤len(s)≤1000 0≤len(s)≤1000。保证字符串中的字符为大写英文字母、小写英文字母和空格中的一种。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。请实现一个函数,将一个字符串s中的每个空格替换成“%20”。

2024-08-18 00:23:21 271

原创 Jz3_数组中重复的数字

空间复杂度的计算主要关注于算法运行时的额外空间使用,而不包括函数运行时所需的栈空间(如参数、局部变量、寄存器信息等),因为这部分空间在编译期间已经确定,不属于运行时的额外空间。P41解释:所有操作步骤都是在输入数组上进行的,不需要分配额外的内存,因此空间复杂度为O(1).关于空间复杂度:数组用容器vector来存储,空间复杂度为O(n),2. 书中的解法思路:数组元素和下标一 一对应,时间复杂度O(N)1.---排序+双指针-时间复杂度O(nlogn),书中解法-剑指offer-P40。

2024-08-18 00:19:52 180

原创 C++学习之第二十一天-vector容器底层实现以及类模板实现快排、堆排

1.Vector容器底层实现1.空间的申请和释放:allocate和deallocate//空间的申请,申请的是原始的,未初始化的空间pointer allocate( size_type n, const void * hint = 0 );T* allocate( std::size_t n, const void * hint);T* allocate( std::size_t n );//空间的释放void deallocate( T* p, std::size_t n );.

2021-11-24 16:09:48 2023

原创 C++学习之第二十天-STL之算法algorithm

知识点1.概述 算法中包含很多对容器进行处理的算法,使用迭代器来标识要处理的数据或数据段、以及结果的存放位置,有的函数还作为对象参数传递给另一个函数,实现数据的处理。 这些算法可以操作在多种容器类型上,所以称为“泛型”,泛型算法不是针对容器编写,而只是单独依赖迭代器和迭代器操作实现。 2.分类 1、非修改式序列操作:不改变容器的内容,如find()、for_each()等。 2、修改式序列操作:可以修改容器中的内容,如transform()、random_shu...

2021-11-22 02:36:04 858

原创 C++学习之第十九天-STL之迭代器

1.定义: 迭代器(iterator)模式又称为游标(Cursor)模式,用于提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。 或者这样说可能更容易理解:Iterator模式是运用于聚合对象的一种模式,通过运用该模式,使得我们可以在不知道对象内部表示的情况下,按照一定顺序(由iterator提供的方法)访问聚合对象中的各个元素。2.迭代器产生的本质。 Iterator类的访问方式就是把不同集合类的访问逻辑抽象出来,使得不用暴露集合内部的结构而达到循环...

2021-11-21 11:26:05 1199

原创 C++学习之第十八天-STL无序关联式容器-unordered_set、unordered_map

1.知识点 无序关联式容器:底层实现使用哈希表。无序关联式容器中的元素没有顺序,针对于自定义类型需要自己定义std::hash函数与std::equal_to函数1.unordered_set //1、key值是唯一的,不能重复 //2、key值是没有顺序的2.unordered_multiset //1、key值是不唯一的,可以重复 //2、key值是没有顺序的3.unordered_map //1、key值是唯一的,不能重复 //2、key值是没有...

2021-11-20 20:23:56 1023

原创 C++学习之第十八天-STL有序关联式容器-set、map

关联式容器—set、multiset、map、multimap知识点总览1.关联式容器: 底层实现使用红黑树。初始化、遍历、查找(count,find)、插入(insert)(set与map需要判断插入是不是成功),自定义类型需要去对Compare进行改写(std::less、std::greater、函数对象)。2.set1、不能存放关键字key相同的元素,关键字必须唯一2、默认以升序进行排列3、底层实现是红黑树--不支持进行数据修改,不支持下标访问4...

2021-11-20 19:41:22 687

原创 C++学习之第十七天-再探文本查询-实现与、或、非查询方法

代码的实现基本是手敲一遍C++ Primer5 15.9文本查询再探,进一步巩固,继承、抽象基类、虚函数等等知识点。面向对象程序设计基于Day14天的文本查询进行扩展:TextQuery类:该类中有个query查询操作,返回一个结果存在QueryResult中QueryResult类:保存一个单词的查询结果:单词、行号集合、句子集合1.Query_base_抽象层,提供抽象接口。虚函数eval:接受一个TextQuer...

2021-11-17 23:10:48 1080

原创 C++学习之第十六天-STL序列式容器-vector,deque,list

序列式容器-vector/deque/list1.序列式容器-vector/queue/list三种主要构造方式与四种遍历方式。知识点:​ 1.三种容器的初始化方式都是一样的​ 2.vector/deque可以支持下标运算符访问,list不允许,list容器里面没有重载[]运算符。vector容器的三种构造函数vector容器构造函数:--plus deque和list,构造函数源码基本差不多。1.vector( size_type count, ...

2021-11-16 00:51:21 1693

原创 C++学习之第十五天-模板与泛型编程

知识点总结1.函数模板-泛型编程,类型参数化:template<typename/class T>,typename和class效果一样 1.T是一个通用的数据类型,告诉编译器如果下面紧跟着的函数或者类中出现T,不要报错2.模板的使用 1.自动推导类型,编译器必须推导出一致的T数据类型,才能正常使用函数模板。 2.显式指定模板类型:mySwap<int>(a,b) 3.模板不能单独使用,...

2021-11-15 20:53:36 1578

原创 C++学习之第十四天-智能指针shared_ptr的应用-文本查询

代码实现基本是手敲一遍Primer C++第五版12.3文本查询程序设计,写一遍来进行学习巩固。文本查询程序类的定义TextQuery类1.提供一个istream,来读取输入文件。2.提供一个query操作,接受一个string,返回一个QueryResult对象来表示String出现的那些行。3.考虑QueryResult对象共享数据的要求,QueryResult类保存单词关联的行号set 1.三个数据成员:1.要查询的单词 2.单词所对应行号set的智能指针 3.句子...

2021-11-13 19:32:48 1907

原创 C++学习之第十三天-智能指针

知识点总结:1.引出: 如何智能指针自动关闭文件指针-代码实现2.通用智能指针进行资源管理RAII-重载解引用运算符*和 -> 运算符,用于托管new出来的对象的释放。---代码实现3.C++四种智能指针:auto_ptr, unique_ptr, shared_ptr,weak_ptr. 1.auto_ptr有bug,已被弃用 2.unique_ptr-不会让多个对象拥有同一资源,不允许进行拷贝构造、赋值,支持移动语义 3.share...

2021-11-12 22:15:41 764

原创 C++学习之第十三天-移动语义与完成COW String类

1.如何区分左值、右值、左值引用、右值引用、const左值引用。String(const char *);String(const String &);~String();问题:临时对象的构造和析构带来了不必要的资源拷贝解决:右值机制-可以在语法层面识别出临时对象,在使用临时对象构造新对象时(即拷贝构造),将临时对象的所有资源都转移到新的对象中,能消除这种不必要的拷贝。左值和右值:1.能对表达式进行取地址的为左值,否则为右值;左值和右值都针对表达式而言的。2.左值是指表达式结束

2021-11-12 17:47:43 1036

原创 C++学习之第十二天-虚函数、纯虚函数

知识点总结1.动态多态被激活的五个条件--重要1.基类定义虚函数2.派生类重写该虚函数3.创建派生类对象4.基类的指针指向或者引用绑定到派生类的对象5.基类用指针或者引用来调用虚函数2.对虚函数进行访问的五种方式1.通过指针来访问 >使用指针访问虚函数时,编译器根据指针所指对象的类型决定要调用哪个函数(动态联编),而与指针本身的类型无关。 2.使用引用访问虚函数 >与使用指针访问虚函数类似,表现出动态多态特性。 >不同的是,引用...

2021-11-11 23:11:37 874

空空如也

空空如也

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

TA关注的人

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