自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Kaimar的博客

爱踢足球的Kaimar⚽

  • 博客(439)
  • 收藏
  • 关注

原创 【C语言进阶笔记】

1. const(常量指针、指针常量)2. static3. extern4. 指针数组和数组指针5. 结构体对齐6. int / uint取值范围、二进制形式与转换、负数表示7. '\0','0',"0",0之间的区别8. 类型自动转换9. 内存结构10. 大小端

2023-06-01 17:57:07 942

原创 【计算机操作系统学习资源汇总】

做优秀资源的搬运工!阅读经典,传承经典!每个人的水平和理解不同,因此总结的水平也不同,推荐阅读一手资源,有时间尽量啃书。发现好的资源会持续更新…

2023-05-20 11:58:43 874 1

原创 【计算机网络学习资源汇总】

每个人的水平和理解不同,因此总结的水平也不同,推荐阅读一手资源,有时间尽量啃书。做优秀资源的搬运工!读经典书籍,传承经典!发现好的资源会持续更新…

2023-05-20 11:39:20 918

原创 【问题解决】Linux中无法下载Github的项目

【问题解决】Linux中无法下载Github的项目。

2022-10-13 17:33:06 5625 7

原创 【计算机网络】Socket原语和通信原理

文章目录1. 什么是Socket2. Socket原语3. Socket通信原理4. 消息接收参考最近面腾讯,问了Socket原语和通信原理的问题,没有答好,因此参考资料总结一下。1. 什么是SocketSocket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。2. Socket原语面试官:socket原语有哪些呢?说一下各自的作用?

2022-05-06 20:47:14 825

原创 【分布式缓存源码分析】总结篇

文章目录1.流程1.1 流程回顾1.2 远程访问分布式节点2.参考上一节解决了访问哪个节点的问题,即选择哪个分布式节点获取缓存值,本节实现分布式节点注册和与远程节点的服务端通信。1.流程1.1 流程回顾 是接收 key --> 检查是否被缓存 -----> 返回缓存值 ⑴ | 否 是 |-----> 是否应当从

2022-03-24 21:01:20 1126 1

原创 【LeetCode】516. 最长回文子序列(错题2刷)

思路找出其中最长的回文子序列,并返回该序列的长度。删除某些字符或者不删除任何字符形成的一个序列。其实最难的是如何判断回文串,我们写一个函数来判断当然可以,但是那样时间复杂度增加了太多,采用dp的话,其实不用去函数遍历判断,只需要承前启后,用前面判断的结果来判断后面能否构成回文串。func max(a, b int) int { if a > b { return a } return b}func longestPalindromeSubse..

2022-03-07 18:02:16 206

原创 【LeetCode】647. 回文子串(错题2刷)

思路首先第一个就是暴力求解,然后想到动态规划。// 暴力法func isSubstrings(s string, start int, end int) bool { for start <= end { if s[start] != s[end] { return false } start++ end-- } return true}func countSubstri...

2022-03-07 17:22:38 180

原创 【LeetCode】72. 编辑距离(错题2刷)

思路请返回将 word1 转换成 word2 所使用的最少操作数 。func min(a, b int) int { if a < b { return a } return b}func minDistance(word1 string, word2 string) int { w1Len, w2Len := len(word1), len(word2) dp := make([][]int, w1Len + 1) ...

2022-03-07 16:44:08 193

原创 【LeetCode】583. 两个字符串的删除操作(错题2刷)

思路感觉上这道题可以转为最长公共子序列,然后用较长的那个字符串长度减去最长公共子序列就得到了最少删除。func min(a, b int) int { if a > b { return b } return a}func minDistance(word1 string, word2 string) int { w1Len, w2Len := len(word1), len(word2) // dp[i][j]:以i-1为结尾的..

2022-03-07 16:17:26 147

原创 【LeetCode】115. 不同的子序列(错题2刷)

思路计算在 s 的子序列中 t 出现的个数。难点在于可能有多种不同的操作,怎么去覆盖这个多种不同的操作呢。func numDistinct(s string, t string) int { // 0 <= s.length, t.length <= 1000 sLen, tLen := len(s), len(t) // dp[i][j]表示以i-1为结尾的t子序列中出现以j-1为结尾的s的个数 dp := make([][]int, tLen +...

2022-03-07 15:54:42 194

原创 【LeetCode】392. 判断子序列(错题2刷)

思路这道题目和最大连续子序列长度那道题很像,这是它是判断s能否是t的连续子序列。参考题解发现,这道题目其实是编辑距离的初始题目,它的dp[i][j] = dp[i][j - 1]这里与最大连续子序列是不同的,因为它只是dp[i][j] = dp[i][j - 1]而不是dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]),为什么不能去动s呢?因为题目要求判断 s 是否为 t 的子序列,如果是求了判断 s 是否为 t 的子序列,这里要求是连续的,而之前是相对顺序一致即可...

2022-03-07 15:22:16 219

原创 【LeetCode】53. 最大子数组和(错题2刷)

思路func max(a, b int) int { if a > b { return a } return b}func maxSubArray(nums []int) int { // 1 <= nums.length <= 10^5 n := len(nums) // dp[i]表示到下标i的最大子数组和 dp := make([]int, n) dp[0] = nums[0] ...

2022-03-07 14:49:55 185

原创 【LeetCode】1143. 最长公共子序列(错题2刷)

思路在初始化出了问题,参考题解func max(a, b int) int { if a > b { return a } return b}func longestCommonSubsequence(text1 string, text2 string) int { // 1 <= text1.length, text2.length <= 1000 n1, n2 := len(text1), len(tex...

2022-03-07 11:56:49 147

原创 【LeetCode】718. 最长重复子数组(错题2刷)

思路返回 两个数组中 公共的 、长度最长的子数组的长度 。两个数组,那么应该是要用二维dp。定义:dp[n1][n2],dp[i][j]表示第一个数组的位置i到第二个位置的位置j的公共最长长度;转移方程:如果nums1[i] == nums2[j],dp[i][j] = max(dp[i][j], dp[][] + 1);初始化:;遍历顺序:。func max(a, b int) int { if a > b { return a } ret..

2022-03-05 17:55:16 123

原创 【LeetCode】300. 最长递增子序列(错题2刷)

思路返回最长严格递增子序列的长度。很明显是动态规划了,重叠子问题嘛。dp的定义:dp[len(nums)],dp[i]表示到位置i的最长严格递增子序列的长度;dp的状态转移方程:若当前数字大于前一个,dp[i] = max(dp[i], dp[i - 1] + 1);若当前数字不大于前一个则dp[i] = dp[i - 1];出问题了,参考题解。func max(a, b int) int { if a > b { return a } ret...

2022-03-05 17:38:34 184

原创 【LeetCode】714. 买卖股票的最佳时机含手续费(错题2刷)

思路直接搞,明确只有持有、不持有、不操作三种状态即可,然后就是状态转换。func max(a, b int) int { if a > b { return a } return b}func maxProfit(prices []int, fee int) int { // 1 <= prices.length <= 5 * 10^4 n := len(prices) // 持有或不持有,0不操作,1持有,...

2022-03-05 17:01:29 233

原创 【LeetCode】309. 最佳买卖股票时机含冷冻期(错题2刷)

思路卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。可以尽可能地完成更多的交易(多次买卖一支股票)。相比于之前的股票题目,这道题就是可以多次交易,并且加入了冷冻期,在买入的时候需要判断冷冻期。dp定义:可以知道持有状态有前一天持有,前一天不操作到买入,前一天是冷冻期买入;不持有是前一天不持有,前一天持有到卖出;冷冻期是从卖出进入到冷冻期;dp[len(prices)][4],dp[i][0]代表不操作,dp[i][1]代表第i天持有股票的最大利润,dp[i][2]代表不持有股票的最大...

2022-03-05 16:40:04 282

原创 【LeetCode】188. 买卖股票的最佳时机 IV(错题2刷)

思路你最多可以完成 k 笔交易。思路同之前完成2笔交易相同,需要对应的申请k维数组,然后前后交易依赖。dp[i][0]表示第i天持有股票的最大利润,dp[i][1]表示第i天不持有股票的最大利润;func max(a, b int) int { if a > b { return a } return b}func maxProfit(k int, prices []int) int { n := len(prices) i...

2022-03-05 15:48:42 227

原创 【LeetCode】123. 买卖股票的最佳时机 III(错题2刷)

思路求最大利润,最多可以完成 两笔 交易。必须在买卖完一次后再进行第二次交易。同理,买卖股票依然是有买入、持有、卖出、不操作四种状态。dp定义:dp[len(prices)][4],dp[i][0]表示第一次交易中持有股票的最大利润,dp[i][1]表示第一次交易中不持有股票的最大利润,dp[i][2]表示第二次交易中持有股票的最大利润,dp[i][3]表示第二次交易中不持有股票的最大利润;dp的状态转移方程:dp[i][0]要么是之前买了,要么是今天买,dp[i][0] = max(dp[i...

2022-03-05 15:11:49 317

原创 【LeetCode】121. 买卖股票的最佳时机(错题2刷)

思路一种就是暴力求解,求任两个之间的最大差值即可,但是超时。数组表示每天的价格,求只交易一次的最大利润,如果你不能获取任何利润,返回0 。考虑动态规划,其实最对于每一天来说就只有三种状态,买入、卖出、持有。dp的定义:dp[len(prices)][3];dp的状态转移方程:要么当天买入,买入则dp[i][0] = prices[i],要么当天持有dp[i][1] = dp[i - 1],要么卖出dp[i][2] = prices[i] - dp[i][1];这里感觉就没对,参考题解...

2022-03-05 14:44:53 311

原创 【LeetCode】337. 打家劫舍 III(错题2刷)

思路如果两个直接相连的房子在同一天晚上被打劫 ,房屋将自动报警。入口只有root,但是开始偷的地方不一定是在root,因此结合二叉树的遍历和动态规划,每个节点依然只有偷或不偷两种状态。计划采用前序递归进行二叉树遍历。写出来一版代码,结果有问题。本题一定是要后序遍历,因为通过递归函数的返回值来做下一步计算。因为最后实际是从root返回的,因此要从下晚上累计。/** * Definition for a binary tree node. * type TreeNode struct {...

2022-03-04 12:16:16 251

原创 【LeetCode】213. 打家劫舍 II(错题2刷)

思路所有的房屋都 围成一圈 ,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 ,计算在不触动警报装置的情况下,今晚能够偷窃到的最高金额。一种思路就是回溯法去遍历所有可能的情况,但是应该会超时。因此考虑重叠子问题,动态规划。为什么有重叠子问题呢?偷了前面的对后面是否偷,以及偷的数目有影响,因此考虑动态规划。dp的定义:其实对于一间房屋,就只有偷或不偷两种情况,因此定义dp[len(nums)],dp[i]表示从i开始偷得到的最大值;dp的转移方程:dp[i] = max(nums[i]偷...

2022-03-04 11:23:02 260

原创 【LeetCode】139. 单词拆分(错题2刷)

思路是否可以利用字典wordDict 中出现的单词拼接出 s 。返回true或false。注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。思路:可以把它看成是求排列的问题,把字符串的所有情况拼接起来看看,但是和回溯搜索有不同,采用背包问题的思路来计算。定义:dp[len(s) + 1],dp[j]表示当前能够拼接成的字符串;转移方程:dp[j] = dp[j] + dp[j - len(wordDict[i])];初始化:空字符串;遍历顺序:排列,先背包后物品。参...

2022-03-02 19:00:38 220

原创 【LeetCode】322. 零钱兑换(错题2刷)

思路每种硬币的数量是无限的。如果没有任何一种硬币组合能组成总金额,返回 -1 。计算并返回可以凑成总金额所需的最少的硬币个数。定义:dp[amout],dp[j]表示可以凑成总金额j所需的最少的硬币个数;转移方程:dp[j] = min(dp[j],dp[j - coins[i]] + 1);初始化:dp[0] = amount+1,全部都初始化为amount+1,因为这代表最大是由amount个1构成,+1表示若没有结果则返回-1。遍历顺序:找组合,只要有结果就行,因此先物品再背包即可;...

2022-03-02 17:45:26 150

原创 【LeetCode】377. 组合总和 Ⅳ(错题2刷)

思路返回总和为 target 的元素组合的个数,可以看到数字可以重复使用,且它并不是组合问题,因为可以看到(1,3)和(3,1)的出现。考虑完全背包中的排列问题。定义:dp[target],dp[j]表示总和为j的元素组合的个数;方程:dp[j] += dp[j - nus[i]];初始化:dp[0] = 1,其余为0,否则第一个为0,会导致后面全部都是0不会改变,从方程可以看到。遍历顺序:先背包后物品,因为是要求排列。func combinationSum4(nums []int, ...

2022-03-02 16:50:16 210

原创 【LeetCode】518. 零钱兑换 II(错题2刷)

思路返回可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。没有结果返回0。这是一个很明显的完全背包问题,首先无限个,这是一个很明显的特征,其次前面的比amount小的组合对后面构成amount有影响,所以想到重叠子问题可能动态规划。amount作为背包容量,coins作为物品,coins[i]既是重量又是价值。定义:dp[amount],dp[j]表示容量为j时,可以凑成j的总数;状态转移方程:dp[j] = max(dp[j], dp[j - coins[i]]);初始化:都为0...

2022-03-02 16:21:19 99

原创 【LeetCode】474. 一和零(错题2刷)

思路该子集中 最多 有 m 个 0 和 n 个 1 。返回的是最大子集长度。一种想法就暴力遍历,使用回溯法搜索出所有的情况,然后取一个最大的。只是采用暴力法应该会超时。这道题其实是有覆盖子问题的,即m = 5, n = 3是基于m = 4, n = 2及更小的直到1,因此考虑到动态规划的背包问题,然后本题子集中的元素只能用一次,所以是01背包问题,现在不同的是m和n它有两个背包容量,分别是0和1,字符串的0、1长度分别为物品的重量,即0和1各自的个数。定义:dp[m][n],dp[i][j]表...

2022-03-02 15:49:02 239

原创 【LeetCode】494. 目标和(错题2刷)

思路第一感觉是暴力法遍历,但是会超时。每个nums只能用一次,物品是nums[i],价值也是nums[i],背包容量是target,因此可以类比为01背包问题,棘手的是添加正负的问题。参考题解S就是targetfunc sum(nums []int) int { sum := 0 for _, v := range nums { sum += v } return sum}func abs(a int) int { ret...

2022-03-01 16:34:35 183

原创 【LeetCode】1049. 最后一块石头的重量 II(错题2刷)

思路想到先排序,然后每次匹配相邻的两个石头进行粉碎,粉碎的结果放在下一轮,本轮不继续。参考题解(代码随想录)func sum(arr []int) int { s := 0 for i := 0; i < len(arr); i++ { s += arr[i] } return s}func max(a, b int) int { if a > b { return a } retur...

2022-03-01 15:55:40 190

原创 【LeetCode】96. 不同的二叉搜索树(错题2刷)

思路对于树来说,要么左要么右,因此确定了两种变换形态,然后采用累加的操作,定义一个dp。dp的定义:dp[n],dp[i]表示i作为根节点有多少种树;dp的状态转移方程:dp[i] = dp[i - 1];dp的初始化:。搞不出来啊😭参考题解就是每次选一个根节点,然后计算它的左右子树的可能性。func numTrees(n int) int { // 1到i为节点组成的二叉搜索树的个数为dp[i] dp := make([]int, n + 1) dp[0..

2022-03-01 12:09:13 85

原创 【LeetCode】343. 整数拆分(错题2刷)

思路一个直观的感受就是这几个数如果越接近,乘积就会越大,但问题是k怎么确定呢?想到从2开始,先求平均数,向下取整,然后得出取得的几个数,求积,放入dp[i],然后继续计算下一个,如果出现dp[i] < dp[i - 1]那么就终止,返回dp[i]。参考题解(代码随想录)func max(a, b int) int { if a > b { return a } return b}func integerBreak(n int) in..

2022-03-01 11:10:27 71

原创 【LeetCode】63. 不同路径 II(错题2刷)

思路这道题目就是在62.不同路径的基础上加了一个障碍物,只需要考虑清楚遇到障碍物怎么计算。当遇到障碍物,则此路走不通,那么直接至dp[i][j]为0。定义:dp[m][n],dp[i][j]表示到(i, j)的所有路径数;状态转移方程:若不是障碍物,则dp[i][j] = dp[i-1][j] + dp[i][j - 1],若是障碍物,则至0;初始化:第一行第一列初始化为1,但是如果有障碍物,那么后面的所有置为0。func uniquePathsWithObstacles(obstacl...

2022-03-01 10:28:21 82

原创 【LeetCode】62. 不同路径(错题2刷)

思路每次只有两种情况,就是向下和向右,因此就来找一个向下和向右的关系之和即可。这种有前后关系的想到用动态规划来解决。动态规划的定义:定义dp[m][n],dp[i][j]表示走到(i, j)位置的所有不同路径;状态转移方程:dp[i][j] = dp[i-1][j] + dp[i][j-1] + 2;即从左边来或从上面来。第一行和第一列除外,i==0,dp[i][j] = dp[i][j - 1] + 1;j == 0,dp[i][j] = dp[i - 1][j] + 1。初始化:dp[0]...

2022-02-28 21:17:22 79

原创 【LeetCode】714. 买卖股票的实际含手续费(错题2刷)

思路无限次地完成交易,买入后卖出会有手续费。这道题很容易想到要用dp来做,因为有一个前后的关系,然后在过程中记录最大利润。这道题参考题解,后面在动态规划股票买卖题目二刷中再来总结。func max(a, b int) int { if a > b { return a } return b}func maxProfit(prices []int, fee int) int { // 总共就两种状态,一种是持有股票,一种是没有持有股票 ...

2022-02-27 21:16:06 90

原创 【LeetCode】738. 单调递增的数字(错题2刷)

思路每个相邻位数,核心在于这个位要满足。一种简单的方法时分为了两步第一步是判断是否满足单调递增,若满足则返回,若不满足则-1判断。func isIncreasing(n int) bool { s := strconv.Itoa(n) for i := 1; i < len(s); i++ { if s[i] - '0' < s[i - 1] - '0' { return false } } re...

2022-02-27 20:29:16 89

原创 【LeetCode】56. 合并区间(错题2刷)

思路先排序,按照左坐标来排,然后判断后一个的左坐标与前一个的右坐标的大小关系,若小于等于则有覆盖,若大于则前一个区间是一个单独的区间,后面继续计算。func max(a, b int) int { if a > b { return a } return b}func merge(intervals [][]int) [][]int { // 排序 sort.Slice(intervals, func(i, j int) bool..

2022-02-27 19:57:26 66

原创 【LeetCode】763. 划分字母区间(错题2刷)

思路小写字母组成,划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。一种思路是先统计出每个字母出现的最远坐标,然后变成了找最短结束位置的问题,因为要尽可能多分,所以就要尽可能找结束位置在前面的字母,然后在遍历到最远下标的过程中,更新遇到的字母的最大位置,直到这个位置为止,这里就是一个分割点。func partitionLabels(s string) []int { sLen := len(s) // 记录每个字母的最大坐标 s..

2022-02-27 18:00:30 196

原创 【LeetCode】435. 无重叠区间(错题2刷)

思路返回需要移除区间的最小数量,使剩余区间互不重叠。同样看到是两个维度,一个一个来解决。还是根据第一个维度从小到大排序,第一个维度相等则第二个维度从小到大排列,因此记录删除的时候就删除覆盖范围大的。每次需要比较后一个的第一个维度与前一个的第一个维度的大小,若不重叠,则更新cover为后一个的第二个维度,若重叠则不更新,删除后一个,记录删除+1。参考题解采用的是从前往后遍历,然后排序是根据第一个维度进行排序,导致部分出错。找最早结束的会议,尽可能多的安排会议。func eraseOver...

2022-02-26 16:59:08 213

原创 【LeetCode】452. 用最少数量的箭引爆气球(错题2刷)

思路Xstart ≤ X ≤ Xend,则该气球会被引爆,求使得所有气球全部被引爆,所需的弓箭的最小数量。这是一个典型的贪心算法,每支箭都要尽可能多的射中气球。能看到points数组是有两个维度的,因此要一个一个维度的来确定,并让有重合的数组放在一起,以便计算需要的箭。先对points数组进行排序,就按照第一个维度进行排序,从小到大,若相等则第二个维度大的在前面。然后进行比较,记录cover为前一个的第二个坐标,若后一个的第一个坐标小于等于它则可以一起爆,否则,更新cover为后一个的第二个坐标...

2022-02-26 16:05:07 614

空空如也

空空如也

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

TA关注的人

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