自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 406. 根据身高重建队列

copy(people[p[1]+1:i+1],people[p[1]:i+1]) //因为i表示当前遍历的元素下标,而p[1]则表示当前元素的k值,而k值又表明这个元素需要插入的位置,所以需要将p[1]这个位置空出来,而people[p[1]+1:i+1],people[p[1]:i+1]这个语法是将p[1]到i 之间的元素赋值到p[1]+1到i,所以最后一个下标为i的元素即当前元素会被覆盖掉,而最开始的p[1]这个位置元素会空出来,原来这个位置的元素会到p[1]+1。

2023-07-14 18:56:02 232

原创 代码随想录二刷 78. 子集90. 子集 II

start && nums[i] == nums[i-1] { 如果当前元素和之前元素相同,则说明该元素的集合会与之前元素相同,所以需要去除当前元素 ,其他部分与子集代码相同。tmp := make([]int,len(path)) 收集每个元素。

2023-07-06 09:19:06 261

原创 代码随想录二刷 131. 分割回文串 150. 逆波兰表达式求值 93. 复原 IP 地址

start && s[start] == '0' { 如果这个元素不是开头的元素,且这个元素有前导0说明错误,需要终止循环。if start == len(s) { 如果开始下标等于数组长度说明遍历完了整个数组,需要进行收集。if num >=0 && num <= 255 { 如果在0-255这个范围说明合理,收集该元素。num1 := stack[len(stack)-2] 取出两个元素。if start == len(s) { 如果遍历完整个数组,且等于四段说明这是需要的结果。

2023-07-06 09:13:49 145

原创 代码随想录二刷 216. 组合总和 III 17. 电话号码的字母组合39. 组合总和

if candidates[i] + sum > target { 如果不进行排序直接进入该行代码的判断,则会出现以下情况,即当前数被重复使用,且大于目标数,而导致比当前数小的但可能满足条件的数直接被跳出循环 例如 目标数是11 ,当前数是8 ,8+8 > 11 所以会直接跳出循环,导致8 之后的数没有得到遍历,所以需要进行排序,保证当前数比之后的数都小,那么如果加上当前数那么还是大于目标数,那么之后的数也肯定大于目标数。path = path[:len(path)-1] 进行回溯。

2023-07-03 14:41:41 156

原创 代码随想录二刷 235. 二叉搜索树的最近公共祖先701. 二叉搜索树中的插入操作450. 删除二叉搜索树中的节点

if root.Right == nil && root.Left == nil { 此时说明该节点已经是要删除的节点,如果这个节点是叶子节点,则直接向上层返回nil,就删除该节点。if root.Val < p.Val && root.Val < q.Val { 同理如果pq节点都比该节点大,则pq节点一定在该节点的右子树。if root.Val > p.Val && root.Val > q.Val { 如果pq节点都在该节点小,则pq节点一定在这个节点的左子树。450. 删除二叉搜索树中的节点。

2023-06-22 21:15:39 143

原创 代码随想录二刷 530. 二叉搜索树的最小绝对差 501. 二叉搜索树中的众数236. 二叉树的最近公共祖先

if count > max && len(res) > 0 { 如果这个计数大于最大值,并且结果数组里有元素,则说明这个数是新的众数需要清空原来的数组 并将这个数放入数组。= nil { 如果左右子树都不为空,则返回当前节点,当前节点为需要找的节点。= nil && root.Val == pre.Val { 用中序遍历,如果这个节点和之前的节点相等,则将计数加1。if root == p || root == q { 采用前序遍历,如果当前节点等于p或者q则返回当前节点。

2023-06-22 18:06:51 182

原创 代码随想录二刷 617. 合并二叉树654. 最大二叉树

Left : constructMaximumBinaryTree(nums[:index]), 构造左子树,左子树所用的数组是nums[:index]到index为止,不包括index这个最大值。Right : constructMaximumBinaryTree(nums[index+1:]),同理,右子树是从index的下一个元素开始的。root1.Right = mergeTrees(root1.Right,root2.Right) 然后生成右子树。617. 合并二叉树。654. 最大二叉树。

2023-06-19 18:15:10 155

原创 代码随想录二刷 530 二叉搜索树的最小绝对差 98. 验证二叉搜索树 700. 二叉搜索树中的搜索

nil && root.Val - pre.Val < res { 当前一个节点不为空,那么比较前一个节点和当前节点的值,如果比之前的最小差值小,那么就更新最小差值。traverse(root.Left) 定义两个指针,一个pre指针,一个为当前节点的root指针,因为是二叉搜索树,所以用中序遍历是递增序列。如果前一个节点比当前节点大,说明不是二叉搜索树。if root.Val > val { 利用二叉搜索树的特点,如果当前节点值大于要找的值,则向当前节点的左子树寻找。

2023-06-19 18:09:41 111

原创 代码随想录二刷 513 找树左下角的值 112 路径总和 106. 从中序与后序遍历序列构造二叉树

root.Left = rebuild(inorder,postorder,rootindex-(right-rootln)-1,left,rootln-1) right-rootln代表当前树的右子树的节点数,rootindex-(right-rootln)拿根节点的下标减去右子树的节点数,则表示这个下标的前面全部都是左子树,而左子树的根节点就是rootindex-(right-rootln)-1 左边界到根节点下标减1。traverse(root.Left,depth) 遍历左子树。

2023-06-17 19:39:34 158

原创 代码随想录二刷 104 二叉树的最大深度 111 二叉树的最小深度222 完全二叉树的节点个数

return min(minDepth(root.Left),minDepth(root.Right))+1 如果他的左右孩子都为空,则为叶子节点,那么直接将左右孩子的结果取最小值(最小值为0)+1 如果左右孩子都不为空,则取左右孩子的结果的最小值+1.两种情况的表达式都是min(minDepth(root.Left),minDepth(root.Right))+1。= nil && root.Right == nil { 同理,如果他的左孩子不为空,右孩子为空,则是他的左孩子的最小深度+1。

2023-06-09 07:30:27 176

原创 数据结构算法练习 插入排序 冒泡排序 选择排序

注 :i作为下标表示未开始排序的数组的第一个元素,也是排序完成部分的后一个元素 ,这样交换,确保将未排序的最小值放在了排序完成元素的后一个位置。j++ { j表示需要进行排序的元素,从第一个元素,到len(a)-i-1,当每排完一轮,需要排序的元素的最终下标就会往前移动。if a[j] > value { 如果当前j位置的元素大于记录的元素,说明该位置不是要插入的位置,需要将j往前移动,但在移动j之前,需要将a[j]的值向后移动,以腾出插入位置。

2023-06-09 02:38:34 208

原创 代码随想录二刷 226 翻转二叉树 102 二叉树的层序遍历 101 对称二叉树

return defs(left.Left,right.Right) && defs(left.Right,right.Left) 遍历左节点的左孩子和右节点的右孩子和左节点的右孩子和右节点的左孩子。if left == nil || right == nil { 左右如果只有一个为空,那么就说明不对称,返回false。root.Left,root.Right = root.Right, root.Left 交换该节点的左右孩子节点。

2023-06-08 20:31:27 540

原创 代码随想录补打卡 42 接雨水 84 柱状图中最大的矩形

h := min(height[i],height[stack[len(stack)-1]])-mid 高即为当前遍历元素和栈顶元素,此时因为已经弹出了一个元素,所以此时的栈顶元素就为左边的元素 ,在减去中间元素的高度即为可接雨水的高度。mid := height[stack[len(stack)-1]] 此时栈顶元素就为凹槽的中间的那个元素,而当前遍历的元素是凹槽的右边元素,而栈顶下一个元素则为左边的元素。w := i - stack[len(stack)-1] - 1 宽度是两者之间的距离。

2023-06-02 19:00:42 120

原创 代码随想录补打卡 503 下一个更大的元素二

for len(stack)>0 && nums[i%length] > nums[stack[len(stack)-1]] { 和上一题基本一样就是这里递增i的方式是取模。

2023-06-02 00:06:37 141

原创 代码随想录补打卡 739 每日温度 496下一个更大元素

0 && v > temperatures[stack[len(stack)-1]] { 如果这个栈不为空,且遍历到的这个元素大于栈顶元素 那么就要进行统计 temperatures[stack[len(stack)-1]] 因为stack里存放的是下标,stack[len(stack)-1]而这个就表示栈顶元素,而栈顶元素表示数组元素的下标。= 0 && nums2[i] > nums2[stack[len(stack)-1]] { 如果栈不为空且当前遍历的元素大于栈顶的元素。

2023-06-01 15:49:04 106

原创 代码随想录补打卡 647 回文子串 516 最长回文子序列

else if dp[i+1][j-1] == true { 如果两个元素的距离大于了1 ,那么就要判断dp[i+1][j-1] 是否为回文子串,如果 dp[i][j] 是回文子串,那么就说明这个也是回文子串。i-- { 因为dp[i][j]是由dp[i+1][j-1] 推出来的,所以要重底向上,从左往右遍历。func longestPalindromeSubseq(s string) int { dp[i][j]的含义是i-j这个范围的最长回文子序列的长度。

2023-05-30 17:19:23 517

原创 代码随想录补打卡 583两个字符串的删除操作 72 编辑距离

else { 如果这两个数不同,则可能需要三种操作,一是删除数组1的元素,二是删除数组2的元素,3是删除数组1和2的元素。因为这个数都是从前面推出来的,所以遍历到i-1和j-1时说明这两个数组经过dp[i-1][j-1]个操作数已经相同,那么就删除这两个元素即可,所以操作数加2 同理,可能两个数组经过dp[i][j-1]个操作数相同,那么就需要删除j-1这个数,所以操作数加1。i++ { dp[i][0]的意思为如果一个数组长度为i,另一个为空,那么需要的操作数是i。

2023-05-29 17:50:07 296

原创 代码随想录补打卡 392 判断子序列 53 最大子数组和 115 不同的子序列

if s[i-1] == t[j-1] { 如果当前元素相同,则有两种可能,一种是放入这两个元素,其个数则等于在没放入两个元素之前的数组的 举例来说 s为babg t为bag 在最后同时放入g时,他的结果等于bab 中出现ba的个数 第二种可能是在长数组中不放入这个元素,在短数组放入这个元素,放入元素后的新数组出现在原来的长数组中,举例来说bagbbg 和 bag 当两个数组都要放入最后的g时,长数组可以不放入g因为之前已经有出现过bag。if s[i-1] == t[j-1] { 如果元素相同。

2023-05-28 19:24:21 285

原创 代码随想录补打卡 718 最长重复子数组 1143 最长公共子序列 1035 不相交的线

func findLength(nums1 []int, nums2 []int) int { //三道题思路基本一致,dp[i][j]表示的是到第下标为i-1和j-1的两个数组重复元素的个数如果nums[i-1][j-1]相同,那么重复元素的个数要加1并且同时向后移动。dp[i][j] = dp[i-1][j-1]+1 //当前重复元素的个数是由之前元素重复个数推出来的。1143 最长公共子序列。718 最长重复子数组。1035 不相交的线。

2023-05-26 02:47:19 749

原创 代码随想录补打卡 714 买卖股票的最佳时机含手续费 300 最长递增子序列 674 连续递增子序列

if nums[j] < nums[i] { //如果当前这个数大于前面一个数,那么就要将dp[i]的值+1,而在i之前有不同的j,j从0开始遍历,一直遍历到i,而每个dp[j]都可能有不同结果,即每个dp[j]的长度不一样,而如果当前这个数大于num[j],那么就要将dp[j]的值+1以此来表示新的dp[i]的大小,最后由不同的dp[j]+1组成不同的dp[i],要在这之中取一个最大值。for i := 1;i++ { //遍历数组。300 最长递增子序列。674 连续递增子序列。

2023-05-24 09:24:26 168

原创 代码随想录补打卡 188 买卖股票最佳时机4 309 最佳买卖股票时机含冷冻期

dp[i][0] = max(dp[i-1][0],max(dp[i-1][1]-prices[i],dp[i-1][3]-prices[i])) 如果这一天是持有股票,那么他的前一天有三种情况,一是前一天就持有股票,今天什么都没做。dp[i][j] = max(dp[i-1][j],dp[i-1][j-1]-prices[i]) // dp[i][j] 即表示买入的操作,而dp[i-1][j]表示第i天什么都不做,dp[i-1][j-1]-prices[i]表示第i天进行买入操作。

2023-05-23 15:11:54 379

原创 代码随想录补打卡 121买卖股票的最佳时机 122 买卖股票的最佳时机 二123买卖股票的最佳时机 三

dp[i][0] = max(dp[i-1][0],-prices[i]) //如果在第i天持有股票,那么就有两种可能,一种是前一天持有股票,而今天什么都不做,那么他的金钱就是dp[i-1][0],或者是之前不持有,在第i天持有,那么金钱就是-prices[i] ,那么在这一天持有股票的最大值是两者的最大值。可以是买入一次股票,也可以是买入一次后一直持有。dp[i][3] = max(dp[i-1][3],dp[i-1][2]-prices[i]) //下面第二次持有的操作同第一次。

2023-05-22 11:56:17 378

原创 代码随想录补打卡 198 打家劫舍 213打家劫舍2 337打家劫舍3

for i := 2;norobcur := max(leftdp[0],leftdp[1]) + max(rightdp[0],rightdp[1]) //如果不偷当前节点的值,那么就要取选择是否偷左右子树,在偷与不偷左右子树中选择一个最大值。func robtree(cur *TreeNode) []int { //用后续遍历遍历这个二叉树,返回值为一个切片,切片里含有两个元素,一个是偷当前节点的值,一个是不偷当前节点的值,记作dp[0]和dp[1]

2023-05-21 20:52:17 385

原创 代码随想录补打卡 322零钱兑换 279 完全平方数 139 单词拆分

if dp[j] && worddictset[s[j:i]] { 如果dp[j]为真,且j-i这一段组成的字符也存在于字典里,那么整个dp[i]就为真,立刻退出循环,没必要继续将j后移进行判断。for j := 1;dp := make([]bool,len(s)+1) //设置dp数组,dp数组含义为当前个字母下,存在于字典中。dp := make([]int,amount+1) //dp[j]数组的含义是装满容量为j的背包最少需要几件物品。

2023-05-20 15:20:32 580

原创 代码随想录补打卡 518. 零钱兑换 II 377. 组合总和 Ⅳ

举例来说如果用这样的遍历方式装满背包3就有两种情况 一种是1,1,1 另一种是1,2 递推关系式分别为 dp[3] = dp[3] + dp[2] (先装满dp[2],在装入1,对应1,1,1,) dp[3] = dp[3] + dp[1] (对应的是先装满1,在装入2对应1,2,再加上之前的一种方法1,1,1所以此时dp[3]的值为2,即1,2 和1,1,1)此时dp[3] = dp[3] + dp[2] 这个表达式说明此时要放入1 ,是在dp[2]基础上的,即有两种情况 1,1,1,和2,1。

2023-05-19 14:43:11 439

原创 代码随想录补打卡 1049. 最后一块石头的重量 II494 目标和 474 1和0

第二种是3+dp[1]即,之前只要装满dp[1]在装入3 ,同理还有2+dp[2] 和 1+dp[3] 那么要装满dp[4]的方法总共有dp[0]+dp[1]+dp[2]+dp[3]种方法。dp[j][k] = max(dp[j][k],dp[j-x][k-y]+1) //这里背包有两种选择一种是放入这个元素,一种是不放入这个元素,如果不放入这个元素,那么他的数量还是和之前的一样,如果要放入这个元素,那么就要先减去x,y这两个元素,然后再将含有x,y的元素放入。

2023-05-18 16:06:41 512

原创 代码随想录补打卡 416. 分割等和子集

for i := 0;i++ { 思路和一维数组背包一样,只不过重量和价值都等于该元素的大小。if sum % 2 == 1 { 如果和为奇数则不可能分成两个等和子集。

2023-05-17 16:43:16 347

原创 代码随想录补打卡 347前k个高频元素 一维数组的背包问题

因为在递推关系时, dp[j] = dp[j-weight[i]]+value[i] 如果是正序遍历,可能会导致dp[j-weight[i]]和 dp[j] 的值,变为容量为2和容量为3的背包,因为容量为2的背包已经放进了物品0 ,如果此时容量为3的背包的价值是dp[j] = dp[j-weight[i]]+value[i] 即容量为3的背包价值等于容量为2的背包加上物品0的价值。mapnum := map[int]int{} 用map记录对应元素出现的次数。

2023-05-16 18:11:58 439

原创 代码随想录复习 1047. 删除字符串中的所有相邻重复项 150 逆波兰表达式求值 239 滑动窗口最大值

if len(stack) > 0 && stack[len(stack)-1] == s[i] { //如果当前遍历到的元素与栈顶元素相同,那么就说明两个元素重复,要删除这两个元素。if this.empty() == false && val == this.front() { //pop的原则是,如果这个将要pop的值和队列的最开头元素相同,就要把队列里的开头元素一起pop出去,否则不动队列里的元素。queue.pop(nums[i-k]) //将数组的元素从头pop出去。

2023-05-15 15:44:06 545

原创 代码随想录复习 232 用栈实现队列225 用队列实现栈20 有效的括号

0 { //这里的思路是,如果出数组里面还有元素,那么进新的元素的时候,为了满足队列的性质,需要先将停留在出数组里的元素全部压入进数组,然后再进新的元素。hash := map[byte]byte{')':'(','}':'{',']':'['} 先定义一个map,map的key是右括号,value是左括号。if s[i] == '(' || s[i] == '{' || s[i] == '[' { //遇到左括号就放入数组中。

2023-05-14 11:46:55 368

原创 代码随想录复习 454 四数相加 15 三数之和 18 四数之和

A数组里的元素为a 以此类推 若要四数之和相加等于0 ,先统计a+b的值,假设 0-(c+d) = a+b ,那么如果a+b存在,且-(c+d)也存在,那么这四个数相加就是0。for left < right && n3 == nums[left+1] { 如果当前这个数和后一个数相同,则将指针移动到下一个位置,直到当前这个数和后一个数不同,这样做的目的是可以去除和n3相同的数。if j > i+1 && n2 == nums[j-1] { 同理,如果前面的数和这个数相等需要跳过这个数。

2023-05-13 12:16:21 313

原创 代码随想录复习 349 两个数组的交集 202 快乐数 1 两数相加

for _, v := range nums1{ //遍历nums1数组,将nums1里的值作为m的键值,例如,如果nums1里有一个元素2,那么这段代码就会变为m[2] = 1 ,而nums1中的重复元素只会被记录一次。count,ok := m[v] //如果nums2里的元素在nums1里出现过,那么此时count的值会变为1,ok会变为true。= 1 && m[n] == false { //如果这个数没有出现过,或者是这个数不等于1 则继续循环。m[v]-- //并且要将这个键值减1。

2023-05-12 15:53:16 486

原创 代码随想录复习 151反转字符串中的单词242 有效的字母异位词 0-1背包问题

dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]]+value[i]) //否则,则是在不放与放之间取一个最大值,且如果要放这个物品,那么之前背包的最大值应该是当前背包容量减去该物品的容量,在这个容量之下,i-1个物品的最大价值。if slowindex-1 > 0 && b[slowindex-1] == ' '{ //这里是去除最后末尾的空格,有两种情况第一种是最后的元素是空格,第二种情况是最后的元素不是空格。

2023-05-11 21:26:15 392

原创 代码随想录复习 344反转字符串 541 反转字符串二

for i := 0;i < len(s);i += 2 *k { //思路如下,如果i+k小于整个数组长度就反转前k个字符,否则就反转剩余的字符,因为不管是2k个字符还是大于k小于2k个字符,都需要反转前k个字符,如果i+k大于数组长度了,说明剩余字符数小于k个,那么需要全部反转。541 反转字符串二。

2023-05-10 15:36:30 965

原创 代码随想录复习 29删除倒数第N个节点 链表相交,环形链表

if headA == nil || headB == nil { //链表相交的思路如下 ,先计算两个链表的长度,并计算长 //度差,让长的链表先走长度差个位置。原因如下: 假设整个链表长度为size,那么快指针从虚拟头结点的位置走到nil需要size+1步,如果已经走了n+1步,则剩余的步数为size-n步。思路如下 :设置两个指针,快指针每次走两步,慢指针每次走一步。

2023-05-10 13:30:12 785

原创 代码随想录复习 707设计链表 翻转链表,两两交换节点

newnode.Next = this.Dummayhead.Next //虚拟头结点的next指针赋值给新创建节点的next指针,目的是让新创建的指针指向原本链表的头节点,那么新创建的节点就会成为新的头结点。cur.Next = cur.Next.Next //直接将目标节点的下一个节点赋值给当前遍历到的节点的next指针域。i++ { //遍历到目标节点的前一个节点。newnode.Next = cur.Next //cur的next指针赋值给新定义节点的next指针。

2023-05-09 16:33:40 1217

原创 代码随想录复习 203 移除链表元素

if cur.Next.Val == val { //如果下一个节点的值等于目标值,则需要删除下一个节点,下一个节点则为删除的目标节点。cur.Next = cur.Next.Next //所以需要将目标节点指向的下一个节点的指针赋给当前指针指向目标节点的指针。= nil { //遍历的终止条件,如果当前节点为空,或者当前节点为尾结点。cur = cur.Next //如果不是目标值,节点向后移动。prehead.Next = head //虚拟头结点指向头结点。

2023-05-07 16:08:09 456

原创 代码随想录补打卡 96不同的二叉搜索树

//注: 这个遍历是从i = 1 开始,所以最开始会计算dp[1]的值,而dp[2]的值是由dp[1]推出来的,即,dp[2]表示两个节点数的数量,当确定了一个根节点之后,他的子树节点的数量为1,所以1个节点的二叉树数量为dp[1].并且dp[2] 的计算方法,是先计算以1为根节点的数量在加上以2为根节点的数量。即,如果你想知道两个节点的二叉树数量,则必须先知道一个节点的二叉树数量,想要知道有n个节点的二叉树数量,则必须知道从1到n个节点的二叉树数量。for i := 1;

2023-05-07 15:47:37 31

原创 代码随想录复习 209 长度最小的子数组 59螺旋矩阵二

i++ { //然后开始遍历最右边的一列,因为是最右边的一列,所以他的纵坐标是不变的,纵坐标等于right,横坐标则是从top到bottom。i++ { //开始创建最上面的一行,因为是最上面的一行,所以他的横坐标是不变的,改变的只是纵坐标。if res == math.MaxInt { //这里需要注意,如果没有找到那个值,那么需要和最初始的res进行比较,如果相等说明没有改过,则返回0。top,bottom := 0,n-1 //定义四个变量,代表四个方向,即上,下,左,右。

2023-05-07 14:41:53 379

原创 代码随想录补打卡 343整数拆分

dp[i] = max(dp[i],max(j*(i-j),j*dp[i-j])) //dp[i]代表是拆分i的最大值,而拆分的公式是j*(i-j),j*dp[i-j],拆分出的结果和之前的dp[i]进行比较。for j := 1;j++ { //j的意义是拆分i,所以下标从1开始,到i-1结束。dp := make([]int,n+1) //因为最后一个元素是dp[n],所以长度是n+1。dp[0] = 0 //2拆分为1,1 所以乘积为1。

2023-05-05 17:29:14 349

空空如也

空空如也

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

TA关注的人

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