- 博客(55)
- 收藏
- 关注
原创 Leetcode究极刷题笔记(31~35)
一般我们在一个数组中找一个数的思路就是遍历一遍找对应的数的下标即可,但是那样的话时间复杂度就是o(n),但是本题要求的是o(logn),因此我们考虑使用二分进行查找,具体实现看代码即可。
2023-04-13 20:45:46
796
原创 Linux之调试器gdb的使用
使用gdb前首先要了解gdb如何使用,即gdb+可执行程序。在进入gdb调试模式后,首先我们要看到代码,此时我们输入。gdb会记录最近的一条命令,如果记录无变化,可以直接回车。开始调试,如果没有设置断点,就直接运行结束。所写的代码,直接利用其首字母l即可。:查看所有设置的断点(断点的编号)想退出程序,即输入quit即可。只完成当前函数就停下来。:给特定的行号打断点。
2022-09-27 21:27:42
670
原创 C++之内存管理详解
接下来就由我来为大家详细讲解一下C++的内存管理章节这一章节我们重点要了解一下各行代码所在位置首先理解一下C++程序内存区域分布: 局部变量在栈上面,动态开辟的在堆上面,静态在数据段,常量在代码段接下来我们将对C语言与C++之间的不同做出对比(1)malloc(2)calloc//它与上一种的区别为其开辟空间会初始化所有数据为0(3)realloc既然C++兼容C语言,哪么是否可以利用上述代码??答案是当然可以C语言的内存管理虽然可以在C++中更使用,但是有些地方就无能为力,而且用起来十分麻烦,因此C++
2022-08-11 21:48:54
948
原创 排序算法之基数排序
在学习基数排序之前,我们首先要了解基数排序的概念,首先我们要明白相比于其他排序,基数排序中并没有选择与交换的步骤,这就使它与归并和快排等排序算法之间有了较大的区别。基数排序是一种借助多关键字排序的思想对单逻辑关键字进行排序的方法。这里我们利用扑克牌举例,在生活中,我们常常会接触扑克牌游戏,在扑克牌中,有两种不同的属性,其一为扑克牌的种花色,其二就是扑克牌的大小,我们可以利用这两种属性来对扑克牌进行一个比较对比,由此我们可以将类似的思想利用到排序算法中个,这就是我们今天要讲的基数排序。首先我们对这样的一组数据
2022-07-03 21:06:11
893
原创 快排递归改为非递归
首先我们在复习一下快排的递归写法,这里所用的方法为前后指针法:代码如下:但是递归的缺陷是如果递归的层次太深,很容易就会导致栈溢出,所以接下来我们就利用栈的知识来优化一下代码:...
2022-06-26 12:19:34
155
原创 数据结构之排序算法——快排
新手入门必看快排算法 但这种代码会导致死循环,假设左右值均与key相同的话,哪么二者就会不停的交换从而导致死循环,在这里我们做一些小优化:但是随之而来的就有一个更大的问题,那就是如果定义的可以为最左且右边的数都比key大的话,哪么就会造成越界的问题,一次我们在优化一下:故完整的单趟过程如下:在这里顺便说一个问题,为什么要将左边的值作为key,其实这是为了保证第二次的key比第一次的小,这就保证了代码顺利的运行。具体代码如下:接下来我们就再来介绍...
2022-06-26 10:37:11
936
原创 初识希尔排序
在学习希尔排序之前,我们先来了解一下插入排序基本思想:把待排序的记录其关键码值得大小逐个插入到一个排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。具体代码如下:void Insertsort(int* a,int n){ for(int i=0;i<n-1;i++) { int end=i; int temp=a[end+1]; while(end>=0) { if(a[e
2022-05-31 15:52:03
128
原创 二叉树之层序遍历
以上图做简单例子,实现层序遍历利用的就是队列的思想,1进入队列后在出来,同时2与4在进去,2出来3再进去,以此类推。此处我们用C语言来实现(前提是要有队列的代码)要注意的是,我们队列中存放的不是树中的值,而是二叉树的节点具体代码如下:void LevelOrder(BTNode* root){ Queue q; QueueInit(&q); if(root) { Queuepush(&q,root); } while...
2022-05-31 10:20:21
100
原创 数据结构之初识二叉树
一.基本概念首先我们应该了解一些对我们认识二叉树最主要的一些概念(1)节点的度:一个节点含有的子树的个数称为该节点的度(2)节点的层次:从根开始定义,根为第一层,根的子节点为第二层,以此类推。(3)叶子节点:度为0的节点叫做叶子节点在二叉树中还有一些特别的数学知识(1)树的节点总数为2^(n-1)~2^h-1; (2) 度为0的节点=度为2的节点+1;其次还有一些特殊的二叉树(1)满二叉树:一个二叉树,如果每一个层的节点数都达到最大值,则这个树就是.
2022-05-25 11:42:30
349
原创 堆排序之Top-K问题
概念:即求数据结合中前k个最大的元素或者最小的元素,一般数据都比较大(eg:专业前几,国服前百等);对于Top-K问题,相信大家最先想到的就是排序,但是那样的话时间复杂度太大。最佳的方法就是利用堆排序,具体思路如下:一.进行排序进行排序每进行一次上下交换的时间复杂度为o(logN),对N个数进行操作,其时间复杂度为o(N*logN)二.建立N个数的大堆建立大堆之前先排序,时间复杂度为o(N),然后取头部最大的那个数,再利用取top和pop来实现,时间复杂度为o(k*logN),总的时间复
2022-05-24 16:02:26
313
原创 梦开始的地方——两数相加
题目原型:给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出 和为目标值 target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。思路:利用双循环便可以解决此问题。...
2022-05-13 21:31:32
87
原创 Leetcode——一次编辑
题目原型:字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。中心思路:分别求出两个字符串的长度n和m,当 n - m =1 或 m - n =1 时,由于两种情况具有对称性,因此可以定义一个函数统一计算这两种情况。用 longer 表示较长的字符串,shorter 表示较短的字符串,同时遍历两个字符串,比较对应下标处的字符是否相同,如果字符相同则将两个字符串的下标同时加 11,如果字符不同则只将 lon.
2022-05-13 19:50:53
248
原创 编程初阶之初识栈
一.栈的概念栈:一种特殊的线性表,只允许固定的一段插入和删除元素操作。进行数据插入的一端称为栈顶,另一端称为栈底。二.用栈编写项目(1)头文件的编写typedef int SM;typedef struct SL{ SM* a; SM top; SM capacity;}SL;void stackinit(SL* ps);void stackdestroy(SL* ps);void stackpush(SL* ps,SM x);void stackpop(S
2022-05-13 11:53:00
141
原创 Leetcode——复制带随机指针的链表
题目原型:给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。构造这个链表的深拷贝。深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。例如,如果原链表中有 X 和 Y 两个节点,其中 X.random -->..
2022-05-13 10:52:50
164
原创 Leetcode——环形链表
题目原型:给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递。仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。示例 1:输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中...
2022-05-12 18:41:45
569
原创 LeetCode——重排链表
题目原型:给定一个单链表 L 的头节点 head ,单链表 L 表示为:L0→ L1→ … → Ln-1→ Ln请将其重新排列后变为:L0→Ln→L1→Ln-1→L2→Ln-2→ …不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例 1:输入: head = [1,2,3,4]输出: [1,4,2,3]示例 2:输入: head = [1,2,3,4,5]输出: [1,5,2,4,3]中心思路:如果我们认真观...
2022-05-09 11:45:07
477
原创 Leetcode——两数相加(C语言版)
题目原型:给你两个非空 的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0开头。示例 1:输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342 + 465 = 807.示例 2:输入:l1 = [0], l2 = [0]输出:[0]示例 3:输入:l1 = [9,9...
2022-05-09 10:57:52
1256
原创 剑指Offer——链表排序
题目原型:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4链接如下,感兴趣的小伙伴可以试一试:力扣在写链表排序之前,我们先来写一下这道题,对于这道题的思路其实也很简单,即在创建一个节点,通过对两个链表之间的值相互比较来对新的空间赋值,当其中一个链表为空时,直接将另一个链表接到新开辟空间的末尾及实现了此代码。具体.
2022-05-06 22:05:58
192
原创 Leetcode——输出链表倒数第k个节点
题目原型:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。示例:给定一个链表: 1->2->3->4->5, 和 k = 2.返回链表 4->5.思路一:最简单的方法,对链表进行遍历,唯一的难点就是要知道倒数第n个节点即为正数第n-k个节点,n为链.
2022-05-01 21:19:36
1585
原创 数据结构之单链表
相比于顺序表,我们知道顺序表的优点为1.物理空间连续2.下表随机访问但是其缺点也很明显1.空间不够需要扩容。而扩容有一定的性能消耗,其次一般扩容2倍,存在一定空间浪费。2.头部或者中间插入效率低下。故以此缺点上我们提出改进方案1.按需申请释放空间因此我们引入单链表来实现其优化定义:“单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),
2022-04-25 22:25:38
1052
原创 C语言之移除元素
题目原型:给你一个数组 nums和一个值 val,你需要 原地 移除所有数值等于val的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。因为要进行原地修改元素,所以不可以建立一个新的数组,这里我们运用双指针的方法来实现。思路:建立两个指针分别指向第一与最后一个元素,如果第一个元素等于val,则将最后一个元素的值赋给第一个元素,并将最后一个指针向后退一步,...
2022-04-17 22:27:36
1157
原创 Leetcode——旋转数组
题目原型:给你一个数组,将数组中的元素向右轮转k个位置,其中k是非负数。输入: nums = [1,2,3,4,5,6,7], k = 3输出: [5,6,7,1,2,3,4]解释:向右轮转 1 步: [7,1,2,3,4,5,6]向右轮转 2 步: [6,7,1,2,3,4,5]向右轮转 3 步: [5,6,7,1,2,3,4]方法一:建立临时数组,然后将临时数组的值依次复制给原数组,重新复制时需要注意时每一个元素都要往后移动k位,可以利用(i+k)%numsSize来计...
2022-04-12 21:15:50
284
原创 《剑指offer》——模拟实现atoi函数
在实现atoi函数,首先要明白其作用:将字符串转化为整型其原型为:int atoi( const char *string );中心思想:字符减去符号0即为整型此题原型来自剑指offer,面试官要求应聘者写出atoi模拟函数应聘者当即写下如下代码:int my_atoi(const char* str){ int n = 0; while (*str) { n = n * 10 + *str-'0'; str++; } return n;}int main.
2022-04-11 16:29:26
129
原创 利用结构体实现通讯录
在学习完结构体知识后,我们就来一起写一个通讯录。首先明确内容,我们要弄清楚我们要构建的通讯录可以保存1000的人的信息,其次通讯录要能增加联系人,删除联系人,同时要实现对联系人的修改,查找和排序,接着便是开始编写我们的代码首先创建一个工程contact.h来存放所有的头文件,用结构体来编写我们要存放的内容typedef struct PeoInfo{ char name[NAME_MAX]; short age; char sex[SEX_MAX]; char tele[TELE_M
2022-04-10 17:37:31
4366
1
原创 动态内存分配
一.怎样建立动态内存存储对动态内存存储是通过系统提供的库函数来实现的,主要有malloc,calloc,free,realloc这4个函数1.用malloc函数开辟动态内存区其函数原型为void* malloc(unsigned int size),其作用是在内存的动态存储区中分配一个长度为size的连续空间。形参size的类型定为无符号整形。此函数的地址是所分配区域的第一个字节的地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的第一个字节。注:此指针的类型为void,即不指向任
2022-04-10 12:06:33
388
原创 函数递归之汉诺塔
一.递归的定义在调用一个函数的过程中有出现直接或间接地调用该函数本身,成为函数的递归调用。接下来我们就来一起聊一聊关于函数递归的一个非常典型的例子——汉诺塔。首先我们需要了解一下汉诺塔问题是什么:古代有一个梵塔,塔内有三座塔A,B,C。开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个人想把这64个盘子从A座移动C座,但规定每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在下,在移动过程中可以利用B座...
2022-04-07 10:15:49
486
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人