- 博客(85)
- 收藏
- 关注
原创 每日一题:LeetCode-LCR 179. 查找总价格为目标值的两个商品
👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!而要与target值进行比较,这里有三种情况,一种是大于target值,一种是小于target值,最后就是等于target值。其实经过前面这些题的练习,这题的双指针是很容易就想到的,左右位置的值相加进行比较,再做出对应的行为。,当左右指针指向的值相加小于target值,左指针就自增,向后移动,因为是一个升序数组,所以。
2023-12-28 23:44:48
782
11
原创 快速上手makefile自动化构建工具
在windows下,很多东西都是编译器直接帮你做好的,而在Linux下并不是这样,如果也想要实现自动化,就要会写makefile,那么话不多说,开启我们今天的话题!
2023-12-28 18:15:28
2384
44
原创 Linux开发工具——gcc篇
gcc的使用gcc的使用我们前面已经学习了使用vim来编写代码,我们也知道了,Linux下的工具都是各自独立的,vim用来编写代码,我们如何执行代码呢?这就需要用到gcc/g++了,那么话不多说,开启我们今天的话题!
2023-12-25 11:39:33
2974
85
原创 Linux开发工具——vim篇
*三种模式:**正常模式插入模式底行模式我们一共有12种总模式,这里是常见的三种模式,大家有兴趣可以自己查阅资料。打开,关闭,查看,查询,插入,删除,替换,撤销,复制等等操作。
2023-12-19 23:44:13
4943
79
原创 每日一题:LeetCode-LCR 016. 无重复字符的最长子串
这题使用双指针暴力写法也不是很简单,尤其是在右指针回退那里,一不小心就容易出错,而我们使用滑动窗口来解决问题,虽然代码量很少,但是却很不好想,滑动双指针的题做多了可能你觉得滑动双指针不难,可是我认为,我们能想到这题使用滑动双指针更加重要。3、左指针移动之后,我们就与上一次记录的不重复子串进行比较,返回较大值。
2023-12-18 22:40:57
967
15
原创 每日一题:LeetCode-611. 有效三角形的个数
9这个位置的值已经枚举完了,那么我们将right指针向左走一步,重复上述步骤,但是如果当nums[left]+nums[right]<nums[nums.size()-1]时,我们就要移动左指针了,如果当两指针相遇时还没有大于比较值的数,那么左边的情况也不需要再枚举了,因为递增数组1,最大的两个数相加都没有大于比较值,更何况比他们要小的值,所以当两指针相遇时,以当前比较值为基准的情况已经全部枚举完成。还是太高了,我们可以想办法优化一下,三层for循环时间复杂度过高,那还有什么方法能够再优化一下呢?
2023-12-17 10:15:56
441
10
原创 Linux权限详解
目录的可执行权限是表示你可否在目录下执行命令。如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目, 即使目录仍然有-r 读限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。如果对你有帮助的话,还望能留下三连支持一下博主~~
2023-12-10 22:05:30
2548
92
原创 每日一题:LeetCode-11.盛水最多的容器
👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!开启我们今天的斩妖之旅吧!但是我们的暴力解法时间复杂度是比较高的,对于这题来说,暴力解法应该是不能通过的,有兴趣的小伙伴可以自己尝试。其实这题的双指针写法很难想,只能说多做,累积经验,这类型的题目接触多了或许就可以秒杀,反正我是做不到。首先,我们可以使用暴力解法,两层for循环枚举所有情况,枚举完所有情况将最大的值返回即可。
2023-12-07 22:57:35
575
13
原创 每日一题:LeetCode-75. 颜色分类
👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!这题被标为了中等,还是有一定难度的,但是如果你很熟悉快排的过程那么这题对你来说就是小case了,因为这题其实就是以1为基准值,0甩到左边,2甩到右边,很多东西都是融汇贯通的。这题要求我们将三种颜色排好序,其实也就是对0,1,2的划分而已,如果你看了我前面写的题目的话,有一题。🔎🔎如果说代码有灵魂,那么它的灵魂一定是👉👉。
2023-12-05 00:27:35
505
17
原创 每日一题:LeetCode-209. 长度最小的子数组(滑动窗口)
👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!可以看到我们的测试用例过了,但是我们的执行结果却超时了,这说明我们的时间复杂度就太高了,我们应该想一想其他的方法来降低时间复杂度,这就是我接下来要说的————滑动窗口。今天是第一次写滑动窗口的题,果然非常奇妙,居然只有O(N)的时间复杂度,理解滑动窗口的本质才有助于你解决类似问题不会毫无思路。我们可以看到,如果是最坏的情况,
2023-12-03 22:00:51
426
10
原创 每日一题:NowCower-JZ64.求1+2+3+...+n
👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!💪💪当然切记不可😈走火入魔😈,每日打怪,拾取经验,终能成圣🙏🙏!开启我们今天的斩妖之旅吧!虽然这题限制了我们一些语法以及常用的运算符,但是我们依旧可以通过C/C++的语法来解决,其中构造函数和右移运算就是很好的解题方案。🔎🔎如果说代码有灵魂,那么它的灵魂一定是👉👉。对C++语法理解到位,这题就不难了。项数 / 2 == n。
2023-12-02 10:18:13
373
8
原创 每日一题:LeetCode-1089. 复写零
👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!开启我们今天的斩妖之旅吧!虽然这题是让我们在原数组操作,但是我们不妨先开辟一个数组,cur指针指向原数组,dest指针指向新数组,只要cur不为0,dest就复制cur的值,如果cur为0,dest就移动两步,且每一步都写为0。这个时候,我们的cur的位置就是最后需要复写的位置,而dest正是我们需要复写的最后一个元素。
2023-12-01 11:39:53
629
13
原创 【C语言期末不挂科——指针进阶篇】【上】
我们可以用字符指针来接收字符串,有人可能要问了:“指针接收?那是把字符串存储到指针里吗?”,实则不然,想一下,如果是在x86的环境下,指针只有4个字节大小,而这个字符串已经超出4字节的范围。
2023-11-30 16:52:12
1186
84
原创 每日一题:LeetCode-283. 移动零
首先题目给我们一个数组,让我们最终得到的结果被划分成两个区间,一个是元素为0的区间,一个是元素不为0的区间。我把这类题目称为划分数组的题目,而解决这类将数组划分为几个区域的问题,我们经常会使用双指针算法。双指针问题在数组划分类似的问题中非常常见,双指针并不一定是C语言语法中的指针,可以是数组下标,或者某个索引等…
2023-11-29 23:31:21
322
6
原创 每日一题:LeetCode-202.面试题 08.06. 汉诺塔问题
👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!汉诺塔问题很经典,虽然不像二叉树那样直观的感受就是递归,这里就不得不说递归的本质了,其实就是将大问题拆分成小问题,在将小问题拆分成结构相同的小问题。汉诺塔问题是很多小伙伴第一次接触到的递归的题目,非常的经典,当然现在来看其实原理也很简单,我们只需要将大问题拆成子问题就可以了,这道题目的拆解还是比较简单的。
2023-11-28 23:37:50
343
3
原创 每日一题:LeetCode-202.快乐数(一点都不快乐)
虽然力扣把这题给标为了简单,但是如果你想不明白给的第二个条件,这题和困难也相差无二,第一个条件是给你一个正整数,每个位置的平方和就是下一个位置,第二个条件其实说明了在这里只有两种情况,一种是最后变成1一直循环,另外一种情况是存在一个环使得这个数永远不能为1。是1就快乐数,不是1就不是快乐数。👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!循环会不会是无限不相等的循环?
2023-11-27 22:25:59
1401
64
原创 每日一题:LeetCode-LCR 143.子结构判断
👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!开启我们今天的斩妖之旅吧!A树B树必须都不为空树,而且B树一定要是A树的一部分结构或者就是A树,这才能满足B是A的子结构。1、B树为空或者AB都为空的情况,但是题目明确要求了,AB有一个为空,都不为另一棵树的子结构,所以第一点情况是false。3、B树是A树的一部分,并非子树,题目示例也说明了这种B树是A树的子结构。
2023-11-26 18:48:38
464
30
原创 每日一题:LeetCode-103/107.二叉树的(层序/锯齿形层序)遍历
💪💪当然切记不可😈走火入魔😈,每日打怪,日日累积,终能成圣🙏🙏!本题和昨天写的题很像,只不过这次的层序遍历是要从叶子结点所在层向上进行层序遍历,既然我们使用二维数组来进行层序遍历,我们不妨先将正常的层序遍历保存到二维数组中,在正常的层序遍历完成之后,将二维数组的元素(一维数组,存的是每一层节点的值)首尾交换。这两题的相似度很高,我这里都是使用深搜的方式得到正常层序遍历的结果,当然你可以使用队列的形式得到层序遍历结果,这里就不展示了,这两题的不用是对层序遍历的结果的处理,转换成另外的形式。
2023-11-25 16:00:58
452
28
原创 每日一题:LeetCode-102.二叉树的层序遍历
说到二叉树的层序遍历,我们第一反应肯定是用广度优先搜索,广搜需要队列存储每一层的节点,当一层节点处理完之后再将本层已处理的节点全部pop掉,接着处理下一层节点,直到处理完毕,深搜便完成了,这里题目要求用二维数组来接收深搜的结果,所以我们可以开个二维数组,在每层节点pop之前,把每层节点记录在一位数组中,最终把一维数组放到二维数组中。使用深搜也就是dfs,那么如何深搜才是关键,其实我们只需要知道每个节点的层数就可以进行深搜了,我们可以直接用节点的层数把深搜的每个节点压入到对应层的数组中。
2023-11-24 17:11:13
1110
45
原创 每日一题:LeetCode-105.从前序遍历与中序遍历构造二叉树
👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。这是一道力扣的中等题,总的来说也并不算很难,理解掌握对前序遍历与中序遍历递归构建的过程才是最重要的。🔎🔎如果说代码有灵魂,那么它的灵魂一定是👉👉。
2023-11-23 17:00:00
427
23
原创 每日一题:LeetCode-589.N叉树的前序遍历序列构造二叉树
👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!但是这样写的效率非常低,将ans数组拷贝到tmp数组,再将tmp数组拷贝回原数组,这样来来回回的拷贝效率实在是很低,所以我们可以考虑用封装来优化。,递归过程中需要调用栈的开销,平均情况下为 O(logN),最坏情况下树的深度为 N−1,此时需要的空间复杂度为 O(N)。,其中 n 为 N 叉树的节点。
2023-11-22 23:05:09
889
20
原创 Linux入门必备指令
cp指令用于复制文件或目录,如同是知道两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则会把前面指定的所有文件或目录复制到此目录中。直接使用命令就可以,我这里下载过了所以显示的是Northing to do,如果你和我一样,那么你的机器已经有了man命令。从今天开始,我们将进入Linux的学习,想要学好Linux,指令一定是不可忽略的重要部分,那么话不多说,进入今天的正题!当拷贝一个文件到另一个文件时,如果拷贝到的文件不存在,就会在当前目录下创建这个文件并把源文件内容复制进去。
2023-11-20 23:27:50
1598
67
原创 【C语言期末不挂科——指针初阶篇】
对于许多正在学习C语言的小伙伴来说,指针可能会让你非常的头疼,很多人不知道如何控制指针变量,甚至都不敢用指针来写代码。但是在实际的开发中还是经常会和指针打交道的,今天我们开启C语言指针系列的章节学习~
2023-11-18 07:00:00
1033
52
原创 【C++入门篇】保姆级教程篇【下】
上回我们主要谈及了C++里面的类和对象以及类内部的部分成员函数,今天我们继续学习剩下的两个成员函数,以及类的一些其它的应用场景。
2023-11-13 23:09:24
1242
54
原创 希尔排序原理
3、其实预排序的实现和直接插入排序的过程几乎是完全相似,前面也说了当希尔排序的缩小增量为1时,和插入排序没区别,也就是说,插入排序每次都对相邻的数据处理,而希尔排序是将分好的组看成新的数组,例如上面数据的6, 2, 3为一组,我们可以看成其他的数据不存在,只有这一组存在,那么对于这一组而言,希尔排序就是插入排序,将上图的三组都排完序,这一趟预排序就算完成了。2、已排序区数组元素加一,待排序区首元素变为3,end也变为3的下标,tmp记录此元素的值,将tmp与已排序区元素进行比较,首先与5比较,小于5。
2023-11-08 23:05:42
1995
48
原创 归并排序深度剖析
归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。————百度百科实际上归并排序MergeSort)是建立在归并操作上的一种排序算法,利用分治的思想来,将要排序的数据进行逐层分组,一组分两组,两组分四组...直到分到只有一个元素,这个时候在和并元素的同时对元素进行排序,
2023-11-02 00:48:46
713
47
原创 【C++入门篇】保姆级教程篇【中】
在前面我也提到了,struct的写法并不是一个标准类的写法,在C++中类的标准写法是需要关键字——class的,那么该如何定义一个类呢?//类体,由成员函数和成员变量组成//一定要带分号实际上,class为定义类的关键字className为类的名字{}内为类的主体注意类定义结束时后面分号不能省略。类体中内容称为类的成员,类中的变量称为类的属性或成员变量,类中的函数称为成员方法或成员函数。类有两种定义方式1声明和定义全部放在类体中,要注意的是,成员函数如果在类中定义,编译器可能会将其。
2023-10-30 09:53:20
1557
51
原创 【C++入门篇】保姆级教程篇【上】
话说在祖师爷那个年代C语言是主流的高级语言,当然祖师爷也不例外,写项目也是用的C语言,其中祖师也在写大型项目的时候总会遇到这样一个问题:不同的程序员负责实现不同的模块,但是在最后整合的时候总是会有两个程序员用的变量或函数的名字相同。#include//C语言中printf函数所需要的头文件int main()return 0;这种命名冲突要改是很麻烦的,祖师爷经常被这个东西搞得头疼,所以祖师爷在开发C++的时候直接规定了一种关键字来避免这种情况————
2023-10-24 07:00:00
1771
49
原创 一文带你学透快排(快速排序C语言版)
快速排序(QuickSort)采用的是分治思想,即在一个无序的序列中选取一个任意的基准元素pivot,利用pivot将待排序的序列分成两部分,前面部分元素均小于或等于基准元素,后面部分均大于或等于基准元素,然后采用递归的方法分别对前后两部分重复上述操作,直到将无序序列排列成有序序列。——————百度百科1、首先设定一个分界值,通过该分界值将数组分成左右两部分。2、将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。
2023-10-22 07:00:00
1030
38
原创 计数排序详解
计数排序(CountSort)是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。当然这是一种牺牲空间换取时间的做法,而且当O(k)>O(n*log(n))的时候其效率反而不如基于比较的排序(基于比较的排序的时间复杂度在理论上的下限是O(n*log(n)), 如归并排序堆排序。
2023-10-21 07:00:00
1008
6
原创 宏(预编译)详解
_FILE__ //进行编译的源文件__LINE__ //文件当前的行号__DATE__ //文件被编译的日期__TIME__ //文件被编译的时间__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义我们不妨打印出来这些预定义符号int main()return 0;可以发现,打印出来的结果跟预期一样,由(__STDC__)的结果看,dev C++遵循ANSIC。
2023-10-20 07:00:00
1898
15
原创 堆与堆排序操作详解
堆(Heap)是计算机科学中一类特殊的数据结构,是最高效的优先级队列。堆通常是一个可以被看作一棵完全二叉树的数组对象。堆(heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆中某个结点的值总是不大于或不小于其父结点的值;堆总是一棵完全二叉树。将根结点最大的堆叫做最大堆或大根堆,根结点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆斐波那契堆等。堆是线性数据结构,相当于一维数组,有两个直接后继。堆的定义如下:n个元素的序列{k1,k2,ki,…,kn}
2023-10-18 14:44:23
540
20
原创 一文带你搞懂二叉树
二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分。二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个节点————百度百科。
2023-10-05 11:29:03
1012
24
原创 栈和队列详解
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素————百度百科由此可见栈是一种先进后出(First In Last Out)即FILO结构。//线性栈需要数组int top;//栈顶指针记录元素个数。
2023-10-03 20:54:31
381
7
原创 顺序表操作详解
数组可以存储数据,而对数组的数据进行操作,例如增删改查等操作被称为顺序表,顺序表需要大量用到C语言的结构体与指针,我们先来想想,如果想要对一个数组进行数据操作,比如插入元素操作,首先肯定是需要一个数组来存储数据的,那么对于要插入位置的索引是不是还需要一个角标,用来记录元素的个数,在进行元素索引的时候以便于快速找到。typedef struct vector {//结构体定义//size为数组大小,count为数组存储元素个数int* data;//data为数组}vector;
2023-10-03 17:24:28
424
6
原创 链表操作详解
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) +指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据 ————百度百科单链表的访问都是由指针进行访问,不需要扩容,对于数据操作比较快速。双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。
2023-10-03 17:23:50
437
4
原创 内存对齐详解(C语言修仙版)
int n;char c2;char c1;char c2;上面代码定义了两个结构体,两个结构体成员相同,但是顺序不一样,按理来说两个结构体既然成员一样那么两个结构体大小也应相同,那么到底两个结构体的大小是否相同呢?由结果发现结构体成员不是按照顺序在内存中存放的,而是以一定规则存放在内存中的,结构体成员以一种规则在内存中占用不同的字节数,而这种规则就是我们今天要讲的。
2023-07-27 15:24:54
2300
9
原创 C语言结构体、联合与枚举类型
要想使用一个自定义结构体,首先要声明结构体类型,其次在创建结构体变量,之后才能使用此结构体。struct StuInfo{ //结构体的声明//学生姓名int age;//年龄//性别//身高//学生姓名int age;//年龄//性别//身高}s1,s2;//s1,s2为StuInfo的结构体变量int main()//创建学生信息的结构体变量return 0;由此可见,定义结构体需要先声明后使用,且结构体分为结构体成员,结构体参数列表。
2023-07-23 16:07:09
822
7
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅