自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux系统编程学习笔记--第十章

本节对应APUE第十六章——网络IPC:套接字。

2024-06-19 20:43:44 641

原创 Linux系统编程学习笔记--第九章

对应APUE第十五章——进程间通信。进程间通信(IPC,InterProcess Communication)分为:PIPE(管道)Socket(套接字)消息队列信号量数组共享内存这些手段都是用于进程间通讯的,只有进程间通讯才需要借助第三方机制,线程之间的通讯是不需要借助第三方机制的,因为线程之间的地址空间是共享的。

2024-06-19 20:01:56 636

原创 Linux系统编程学习笔记--第八章

本节对应第十四章高级IOIO模型分为五种:阻塞io非阻塞io信号驱动多路转接异步io。

2024-06-19 19:28:43 642

原创 Linux系统编程学习笔记--第七章

本节对应APUE第十一、十二章内容。

2024-06-13 18:43:15 904

原创 Linux系统编程学习笔记--第六章

注意第四行,当在内层循环执行时,有多个SIGINT信号到来,由于被屏蔽,所以不打印叹号,打印星号结束后,代码第十九行解除屏蔽(注意,代码第十九行和第二十行之间也会存在多个中断),响应信号(第五行的第一个叹号),再执行到代码第二十行处时,此时没有信号到来,所以一直挂起。分析:进程运行到sleep(1)的时候,由运行态进入阻塞态,此时如果有信号到来,例如SIGINT,会打断阻塞(唤醒进程),让进程进入就绪态,获得时间片进入运行态,此时进程还没阻塞到1s,就进入了就绪态,即信号会打断阻塞的系统调用。

2024-06-06 17:48:18 1165

原创 Linux系统编程学习笔记--第五章

fork函数是用于创建一个子进程,该子进程几乎是父进程的副本,而有时我们希望子进程去执行另外的程序,exec函数族就提供了一个在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新程序的内容替换了。这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执行脚本文件。当进程调用一种exec函数时,该进程执行的程序完全替换为新程序,而新程序则从其main函数开始执行。

2024-06-05 12:11:04 1050

原创 Linux系统编程学习笔记--第四章

树状目录结构:目录解释:/bin:bin 是 Binaries (二进制文件) 的缩写,这个目录存放着最经常使用的命令。/boot:这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。/dev :dev 是 Device(设备) 的缩写,该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的(一切皆文件)。/etc:etc 是 Etcetera(等等) 的缩写,这个目录用来存放所有的系统管理所需要的配置文件和子目录。

2024-06-02 14:54:48 733

原创 Linux系统编程学习笔记--第三章

UNIX系统的大多数文件IO只需用到5个函数:openclosereadwritelseek。

2024-05-30 19:51:20 1126

原创 Linux修改文件权限

在Linux(包括ubantu,cantos)中,可以使用chmod命令修改文件或目录的权限。

2024-05-30 10:54:24 174

原创 Linux系统编程学习笔记--第二章

IO分为标准IO(stdio)和系统调用IO(sysio);系统调用IO根据操作系统的实现方式而定,对于程序员来说会造成很大困扰(例如打开文件,Linux的系统调用为open,而Windows的系统调用为opendir),于是又有了标准IO,提供了一套标准的IO实现的库函数(例如pringtf,fopen等),它实际上也是调用了系统IO进行操作,但是屏蔽了系统调用IO,方便程序员调用。打开关闭文件输入输出流文件指针操作缓存相关fopen()fseek()fflush()fclose()

2024-05-29 19:54:53 924

原创 Linux系统编程学习笔记--第一章

平台:uabntu20.04工具:vim,gcc,make。

2024-05-28 18:11:17 783

原创 C++力扣题目 42--接雨水 84--柱状图中最大的矩形

力扣题目链接(opens new window)给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例 1:示例 2:接雨水问题在面试中还是常见题目的,有必要好好讲一讲。本文深度讲解如下三种方法:本题暴力解法也是也是使用双指针。首先要明确,要按照行来计算,还是按照列来计算。按照行来计算如图: 按照列来计算如图: 一些同学在实现的时候,很容易一会按照行来计算一会按照列来计算,这样就会越写越乱。我个人倾向于按照列来计算,比较容易理解,接下来看一下按照列如何计算。首

2024-02-23 15:02:13 984

原创 C++力扣题目 739--每日温度 496--下一个更大元素I 503--下一个更大元素II

题目说如果不存在对应位置就输出 -1 ,所以result数组如果某位置没有被赋值,那么就应该是是-1,所以就初始化为-1。在遍历nums2的过程中,我们要判断nums2[i]是否在nums1中出现过,因为最后是要根据nums1元素的下标来更新result数组。

2024-02-23 14:58:39 1010

原创 C++力扣题目 647--回文子串 516--最长回文子序列

力扣题目链接(opens new window)给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。示例 1:示例 2:提示:输入的字符串长度不会超过 1000 。两层for循环,遍历区间起始位置和终止位置,然后还需要一层遍历判断这个区间是不是回文。所以时间复杂度:O(n^3)动规五部曲:如果大家做了很多这种子序列相关的题目,在定义dp数组的时候 很自然就会想题目求什么,我们就如何定义dp数组。绝大多数题目确实是这样,不

2024-02-22 19:39:03 972

原创 C++力扣题目 392--判断子序列 115--不同的子序列 583--两个字符串的删除操作 72--编辑操作

这道题目算是编辑距离的入门题目(毕竟这里只是涉及到减法),也是动态规划解决的经典题型。这一类题都是题目读上去感觉很复杂,模拟一下也发现很复杂,用动规分析完了也感觉很复杂,但是最终代码却很简短。在之前的题目讲解中,我们讲了1143.最长公共子序列 (opens new window),大家会发现 本题和 1143.最长公共子序列 的相似之处。编辑距离的题目最能体现出动规精髓和巧妙之处,大家可以好好体会一下。

2024-02-22 16:47:24 955

原创 C++力扣题目 1143--最长公共子序列 1035--不相交的线 53--最大子数组和

看到代码大家也可以发现其实就是求两个字符串的最长公共子序列,但如果没有做过1143.最长公共子序列 (opens new window),本题其实还有很有难度的。这是Carl为什么要先讲1143.最长公共子序列 (opens new window)再讲本题,大家会发现一个正确的刷题顺序对算法学习是非常重要的!这也是Carl做了很多题目(包括ACM和力扣)才总结出来的规律,大家仔细体会一下哈。贪心算法:最大子序和(opens new window)动规的解法还是很直接的。

2024-02-22 13:35:06 951

原创 C++力扣题目300--最长递增子序列 674--最长连续递增序列 718--最长重复子数组

本题最关键的是要想到dp[i]由哪些状态可以推出来,并取最大值,那么很自然就能想到递推公式:dp[i] = max(dp[i], dp[j] + 1);子序列问题是动态规划的一个重要系列,本题算是入门题目,好戏刚刚开始!本题也是动规里子序列问题的经典题目,但也可以用贪心来做,大家也会发现贪心好像更简单一点,而且空间复杂度仅是O(1)。在动规分析中,关键是要理解和动态规划:300.最长递增子序列 (opens new window)的区别。要联动起来,才能理解递增子序列怎么求,递增连续子序列又要怎么求。

2024-02-22 13:32:13 944

原创 C++力扣题目 309--买卖股票的最佳时机含冷冻期 714--买卖股票的最佳时机含手续费

这次把冷冻期这道题目,讲的很透彻了,细分为四个状态,其状态转移也十分清晰,建议大家都按照四个状态来分析,如果只划分三个状态确实很容易给自己绕进去。

2024-02-21 19:59:03 835

原创 C++力扣题目 121--买卖股票的最佳时机 122-- 买卖股票的最佳时机II 123--买卖股票的最佳时机III 188--买卖股票的最佳时机IV

如果dp[1]取dp[0] - prices[i],今天买入股票,那么dp[2] = max(dp[2], dp[1] + prices[i]);由递推公式 dp[i][0] = max(dp[i - 1][0], -prices[i]);同样dp[i][1]取最大的,dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);一定是选最大的,所以 dp[i][1] = max(dp[i-1][0] - prices[i], dp[i - 1][1]);

2024-02-21 15:43:01 909

原创 C++力扣题目139--单词拆分 198--打家劫舍 213--打家劫舍II 337打家劫舍III

本题和我们之前讲解回溯专题的回溯算法:分割回文串 (opens new window)非常像,所以我也给出了对应的回溯解法。稍加分析,便可知道本题是完全背包,是求能否组成背包,而且这里要求物品是要有顺序的。打家劫舍是DP解决的经典题目,这道题也是打家劫舍入门级题目,后面我们还会变种方式来打劫的。成环之后还是难了一些的, 不少题解没有把“考虑房间”和“偷房间”说清楚。这就导致大家会有这样的困惑:情况三怎么就包含了情况一了呢?本文图中最后一间房不能偷啊,偷了一定不是最优结果。

2024-02-21 15:01:18 969

原创 C++力扣题目377--组合求和VI 爬楼梯进阶版 322--零钱兑换 279完全平方数

求装满背包有几种方法,递归公式都是一样的,没有什么差别,但关键在于遍历顺序!本题与动态规划:518.零钱兑换II (opens new window)就是一个鲜明的对比,一个是求排列,一个是求组合,遍历顺序完全不同。如果对遍历顺序没有深度理解的话,做这种完全背包的题目会很懵逼,即使题目刷过了可能也不太清楚具体是怎么过的。此时大家应该对动态规划中的遍历顺序又有更深的理解了。本题看起来是一道简单题目,稍稍进阶一下其实就是一个完全背包!

2024-02-06 17:31:12 1401

原创 完全背包理论基础 C++力扣题目518--零钱兑换II

细心的同学可能发现,全文我说的都是对于纯完全背包问题,其for循环的先后循环是可以颠倒的!但如果题目稍稍有点变化,就会体现在遍历顺序上。如果问装满背包有几种方式的话?那么两个for循环的先后顺序就有很大区别了,而leetcode上的题目都是这种稍有变化的类型。这个区别,我将在后面讲解具体leetcode题目中给大家介绍,因为这块如果不结合具题目,单纯的介绍原理估计很多同学会越看越懵!别急,下一篇就是了!最后,

2024-02-06 10:39:07 981

原创 C++力扣题目494--目标和 474--一和零

此时 大家应该不禁想起,我们之前讲过的回溯算法:39. 组合总和 (opens new window)是不是应该也可以用dp来做啊?是的,如果仅仅是求个数的话,就可以用dp,但回溯算法:39. 组合总和 (opens new window)要求的是把所有组合列出来,还是要使用回溯法爆搜的。后面我们在讲解完全背包的时候,还会用到这个递推公式不少同学刷过这道题,可能没有总结这究竟是什么背包。此时我们讲解了0-1背包的多种应用,纯 0 - 1 背包 (opens new window)

2024-02-05 09:14:47 933

原创 C++力扣题目416--分割等和子集 1049--最后一块石头的重量II

这道题目就是一道01背包应用类的题目,需要我们拆解题目,然后套入01背包的场景。01背包相对于本题,主要要理解,题目中物品是nums[i],重量是nums[i],价值也是nums[i],背包体积是sum/2。看代码的话,就可以发现,基本就是按照01背包的写法来的。力扣题目链接(opens new window)题目难度:中等有一堆石头,每块石头的重量都是正整数。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。

2024-01-28 14:34:44 949

原创 C++力扣题目 01背包理论基础

讲了这么多才刚刚把二维dp的01背包讲完,这里大家其实可以发现最简单的是推导公式了,推导公式估计看一遍就记下来了,但难就难在如何初始化和遍历顺序上。可能有的同学并没有注意到初始化 和 遍历顺序的重要性,我们后面做力扣上背包面试题目的时候,大家就会感受出来了。下一篇 还是理论基础,我们再来讲一维dp数组实现的01背包(滚动数组),分析一下和二维有什么区别,在初始化和遍历顺序上又有什么差异,敬请期待以上的讲解可以开发一道面试题目(毕竟力扣上没原题)。

2024-01-28 13:10:32 883

原创 C++力扣题目62--不同路径 63--不同路径II 343--整数拆分 96--不同的二叉搜索树

本文分别给出了深搜,动规,数论三种方法。深搜当然是超时了,顺便分析了一下使用深搜的时间复杂度,就可以看出为什么超时了。然后在给出动规的方法,依然是使用动规五部曲,这次我们就要考虑如何正确的初始化了,初始化和遍历顺序其实也很重要!本题是62.不同路径 (opens new window)的障碍版,整体思路大体一致。但就算是做过62.不同路径,在做本题也会有感觉遇到障碍无从下手。其实只要考虑到,遇到障碍dp[i][j]保持0就可以了。

2024-01-27 11:48:32 900

原创 C++力扣题目509--斐波那契数 70--爬楼梯 746--最小花费爬楼梯

斐波那契数列这道题目是非常基础的题目,我在后面的动态规划的讲解中将会多次提到斐波那契数列!这里我严格按照关于动态规划,你该了解这些!中的动规五部曲来分析了这道题目,一些分析步骤可能同学感觉没有必要搞的这么复杂,代码其实上来就可以撸出来。但我还是强调一下,简单题是用来掌握方法论的,动规五部曲将在接下来的动态规划讲解中发挥重要作用,敬请期待!这道题目和动态规划:斐波那契数 (opens new window)题目基本是一样的,但是会发现本题相比动态规划:斐波那契数 (opens new window)

2024-01-24 15:55:17 934

原创 C++力扣题目56--合并区间 738--单调递增的数字 968--监控二叉树

本题只要想清楚个例,例如98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]减一,strNum[i]赋值9,这样这个整数就是89。就可以很自然想到对应的贪心解法了。想到了贪心,还要考虑遍历顺序,只有从后向前遍历才能重复利用上次比较的结果。最后代码实现的时候,也需要一些技巧,例如用一个flag来标记从哪里开始赋值9。本题的难点首先是要想到贪心的思路,然后就是遍历和状态推导。

2024-01-23 14:19:57 855

原创 C++力扣题目435-无重叠区间 763--划分字母区间

这道题目leetcode标记为贪心算法,说实话,我没有感受到贪心,找不出局部最优推出全局最优的过程。就是用最远出现距离模拟了圈字符的行为。但这道题目的思路是很巧妙的,所以有必要介绍给大家做一做,感受一下。

2024-01-20 15:21:49 870

原创 C++力扣题目860--柠檬水找零 406--根据身高重建队列 452--用最少数量的箭引爆气球

咋眼一看好像很复杂,分析清楚之后,会发现逻辑其实非常固定。这道题目可以告诉大家,遇到感觉没有思路的题目,可以静下心来把能遇到的情况分析一下,只要分析到具体情况了,一下子就豁然开朗了。如果一直陷入想从整体上寻找找零方案,就会把自己陷进去,各种情况一交叉,只会越想越复杂了。关于出现两个维度一起考虑的情况,我们已经做过两道题目了,另一道就是135. 分发糖果 (opens new window)。其技巧都是确定一边然后贪心另一边,两边一起考虑,就会顾此失彼。这道题目可以说比。

2024-01-20 14:07:06 756

原创 C++力扣题目1005--K次取反后最大化的数组和 134--加油站 135--分发糖果

贪心的题目如果简单起来,会让人简单到开始怀疑:本来不就应该这么做么?这也算是算法?我认为这不是贪心?本题其实很简单,不会贪心算法的同学都可以做出来,但是我还是全程用贪心的思路来讲解。因为贪心的思考方式一定要有!如果没有贪心的思考方式(局部最优,全局最优),很容易陷入贪心简单题凭感觉做,贪心难题直接不会做,其实这样就锻炼不了贪心的思考方式了。所以明知道是贪心简单题,也要靠贪心的思考方式来解题,这样对培养解题感觉很有帮助。

2024-01-20 11:37:06 918

原创 C++力扣题目122--买卖股票的最佳时机II 55--跳跃游戏 45--跳跃游戏II

股票问题其实是一个系列的,属于动态规划的范畴,因为目前在讲解贪心系列,所以股票问题会在之后的动态规划系列中详细讲解。可以看出有时候,贪心往往比动态规划更巧妙,更好用,所以别小看了贪心算法。本题中理解利润拆分是关键点!不要整块的去看,而是把整体利润拆为每天的利润。一旦想到这里了,很自然就会想到贪心了,即:只收集每天的正利润,最后稳稳的就是最大利润了。这道题目关键点在于:不用拘泥于每次究竟跳几步,而是看覆盖范围,覆盖范围内一定是可以跳过来的,不用管是怎么跳的。大家可以看出思路想出来了,代码还是非常简单的。

2024-01-19 15:53:24 919

原创 C++力扣题目455--分发饼干 376--摆动序列 53--最大子序和

这道题是贪心很好的一道入门题目,思路还是比较容易想到的。文中详细介绍了思考的过程,想清楚局部最优,想清楚全局最优,感觉局部最优是可以推出全局最优,并想不出反例,那么就试一试贪心本题的贪心思路其实并不好想,这也进一步验证了,别看贪心理论很直白,有时候看似是常识,但贪心的题目一点都不简单!后续将介绍的贪心题目都挺难的,所以贪心很有意思,别小看贪心!

2024-01-19 14:47:00 842

原创 C++力扣题目37--解数独

解数独可以说是非常难的题目了,如果还一直停留在单层递归的逻辑中,这道题目可以让大家瞬间崩溃。所以我在开篇就提到了二维递归,这也是我自创词汇,希望可以帮助大家理解解数独的搜索过程。一波分析之后,再看代码会发现其实也不难,唯一难点就是理解二维递归的思维逻辑。这样,解数独这么难的问题,也被我们攻克了。恭喜一路上坚持打卡的录友们,回溯算法已经接近尾声了,接下来就是要一波总结了。

2024-01-18 12:51:55 904

原创 C++力扣题目51--N皇后

本题是我们解决棋盘问题的第一道题目。如果从来没有接触过N皇后问题的同学看着这样的题会感觉无从下手,可能知道要用回溯法,但也不知道该怎么去搜。这里我明确给出了棋盘的宽度就是for循环的长度,递归的深度就是棋盘的高度,这样就可以套进回溯法的模板里了。大家可以在仔细体会体会。

2024-01-18 12:18:11 843

原创 C++力扣题目47--全排列II

continue;continue;都是可以的,这也是很多同学做这道题目困惑的地方,知道也行而也行,但是就想不明白为啥。所以我通过举[1,1,1]的例子,把这两个去重的逻辑分别抽象成树形结构,大家可以一目了然:为什么两种写法都可以以及哪一种效率更高!这里可能大家又有疑惑,既然也行而也行,那为什么还要写这个条件呢?直接这样写 不就完事了?continue;其实并不行,一定要加上或者。

2024-01-17 20:39:06 921

原创 C++力扣题目46--全排列

每层都是从0开始搜索而不是startIndex需要used数组记录path里都放了哪些元素了排列问题是回溯算法解决的经典题目,大家可以好好体会体会。

2024-01-17 19:58:01 1054

原创 C++力扣题目491--非递减子序列

本题题解清一色都说是深度优先搜索,但我更倾向于说它用回溯法,而且本题我也是完全使用回溯法的逻辑来分析的。相信大家在本题中处处都能看到是回溯算法:求子集问题(二) (opens new window)的身影,但处处又都是陷阱。对于养成思维定式或者套模板套嗨了的同学,这道题起到了很好的警醒作用。更重要的是拓展了大家的思路!

2024-01-17 14:08:05 861

原创 C++力扣题目90--子集II

其实这道题目的知识点,我们之前都讲过了,如果之前讲过的子集问题和去重问题都掌握的好,这道题目应该分分钟AC。当然本题去重的逻辑,也可以这么写continue;

2024-01-17 12:49:32 444

原创 C++力扣题目93--复原IP地址

在131.分割回文串 (opens new window)中我列举的分割字符串的难点,本题都覆盖了。而且本题还需要操作字符串添加逗号作为分隔符,并验证区间的合法性。可以说是131.分割回文串 (opens new window)的加强版。在本文的树形结构图中,我已经把详细的分析思路都画了出来,相信大家看了之后一定会思路清晰不少!

2024-01-17 11:35:55 833

空空如也

空空如也

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

TA关注的人

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