40. 单调栈, 739.每日温度,496.下一个更大元素 I,503.下一个更大元素II ,42.接雨水,84.柱状图中最大的矩形 因为我们遍历数组的时候,我们不知道之前都遍历了哪些元素,以至于遍历一个元素找不到是不是之前遍历过一个更小的,所以我们需要用一个容器(这里用单调栈)来记录我们遍历过的元素。,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是整个数组只需要遍历一次。时间复杂度为O(n)。
S02. 手写x86操作系统--内核实现(更新中) 在CPU中运行的是指令,故而代码段猫述符中的DPL,便是当前CPU所处的特权级,这个特权级称为当前特权级,即CPL(Current Privilege Level),它表示处理器正在执行的代码的特权级别。当处理器特权级检查的条件通过后,新代码段的DPL就变成了处理器的CPL,并且且标代码段描述符的DPL将保存在代码段寄存器CS中的RPL位。注意,只是代码段寄存器CS中的RPL是CPL,其他段寄存器中选择子的RPL与CPL无关。在任意时刻,当前特权级CPL保存在CS选择子中的RPL部分。
37. 1143.最长公共子序列 ,1035.不相交的线,53. 最大子序和,392.判断子序列 t[j - 1]),此时相当于t要删除元素,t如果把当前元素t[j - 1]删除,那么dp[i][j] 的数值就是 看s[i - 1]与 t[j - 2]的比较结果了,即:dp[i][j] = dp[i][j - 1]。if (s[i - 1] == t[j - 1]),那么dp[i][j] = dp[i - 1][j - 1] + 1;从递推公式可以看出dp[i][j]都是依赖于dp[i - 1][j - 1] 和 dp[i][j - 1],所以dp[0][0]和dp[i][0]是一定要初始化的。
35. 121. 买卖股票的最佳时机 ,122.买卖股票的最佳时机II,123.买卖股票的最佳时机III 【代码】35. 121. 买卖股票的最佳时机 ,122.买卖股票的最佳时机II,123.买卖股票的最佳时机III。
34. 198.打家劫舍,213.打家劫舍II, 337.打家劫舍III 在上面的方法中,对一个节点 偷与不偷得到的最大金钱都没有做记录,而是需要实时计算。而动态规划其实就是使用状态转移容器来记录状态的变化,这里可以使用一个长度为2的数组,记录当前节点偷与不偷所得到的的最大金钱。以下代码超时了,这个递归的过程中其实是有重复计算了,算了root的四个孙子(左右孩子的孩子)为头结点的子树的情况,又计算了root的左右孩子为头结点的子树的情况,计算左右孩子的时候其实又把孙子计算了一遍。
S01. 手写x86操作系统--引导程序和加载器load的实现 x86在上电启动后自动进入实模式,即16位工作模式,这种模式是最早期的8086芯片所使用的工作模式。早期的芯片设计得较简单、工作模式也较简单,所以有诸多限制: 在后续的芯片设计中,intel为处理器增加了一些新的功能,可以实现某些保护功能,即保护模式。具体的特点如下:在80386及其后续处理器的保护模式下,段描述符是一个8字节(64位)的数据结构,用于定义内存段的基址、限长和访问权限等信息。以下是段描述符的结构及各字段的详细作用。 x86访问内存的机制是“段基址 : 偏移地址”,无论是实模式,还是保护模式
32. 完全背包, 518.零钱兑换 II, 377.组合总和 Ⅳ,70.爬楼梯 (进阶) 如果把遍历nums(物品)放在外循环,遍历target的作为内循环的话,举一个例子:计算dp[4]的时候,结果集只有 {1,3} 这样的集合,不会有{3,1}这样的集合,因为nums遍历放在外层,3只能出现在1后面!我们知道01背包内嵌的循环是从大到小遍历,为了保证每个物品仅被添加一次,而完全背包的物品是可以添加多次的,所以要从小到大去遍历。01背包中二维dp数组的两个for遍历的先后循序是可以颠倒了,一维dp数组的两个for循环先后循序一定是先遍历物品,再遍历背包容量。