![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LeetCode
AAS48
一起学算法
展开
-
Leet code1049 最后一块石头的重量II
我们可以将石头分成两堆,假设为堆 A 和堆 B。我们的目标是使得两堆石头的重量差最小。,我们有两种选择:选取它或者不选取它。个石头中选取一些石头,使得它们的总重量恰好为。个石头中选取一些石头,使得它们的总重量恰好为。个石头中选取一些石头,使得它们的总重量恰好为。个石头中选取一些石头,使得它们的总重量恰好为。假设石头的重量分别为。而这个也正是最后无法合并,剩下的石子重量。的前提下,尽可能地选取石头放入堆 A。1049 最后一块石头的重量II。最后,A堆的石子重量为:j。最后一块石头的重量为。原创 2023-08-13 15:09:58 · 240 阅读 · 0 评论 -
Leet code 面试题 04.12. 求和路径(深搜)
给定一棵二叉树,其中每个节点都含有一个整数数值(该值或正或负)。设计一个算法,打印节点数值总和等于某个给定值的所有路径的数量。注意,路径不一定非得从二叉树的根节点或叶节点开始或结束,但是其方向必须向下(只能从父节点指向子节点方向)。对于一个根结点为root的树,其满足要求的路径数量 = 包含root节点的路径数 + 左子树满足要求的路径 + 右子树满足要求的路径。解释:和为 22 的路径有:[5,4,11,2], [5,8,4,5], [4,11,7]一个递归里面套着另一个递归。原创 2023-08-11 17:10:29 · 165 阅读 · 0 评论 -
Leetcode 678. 有效的括号字符串
由于子串的长度为 len,所以起始位置的最大值为 n - len,以确保子串不会超出字符串的边界。我们可以定义一个二维数组 dp,其中 dp[i][j] 表示从字符串的第 i 个字符到第 j 个字符(闭区间)是否为有效字符串。1、当 s[i] 和 s[j] 分别为 ‘(’ 和 ‘)’ 时,dp[i][j] 可以为有效字符串的条件是 dp[i+1][j-1] 为有效字符串。内部存在一个分割点k,使得 dp[i][k] && dp[k+1][j] 同时为有效的括号字符串。输入:s = “(*))”原创 2023-08-11 14:00:13 · 300 阅读 · 0 评论 -
Leetcode 583 两个字符串的删除操作(经典)
这个问题可以使用动态规划来解决。我们可以构建一个二维数组 dp,其中 dp[i][j] 表示将 word1 的前 i 个字符变成 word2 的前 j 个字符所需的最小步数。最终,dp[word1.length()][word2.length()] 就是将整个 word1 变成 word2 所需的最小步数。给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。每步 可以删除任意一个字符串中的一个字符。原创 2023-08-11 11:43:20 · 312 阅读 · 0 评论 -
Leetcode 784. 字母大小写全排列(回溯)
给定一个字符串 s ,通过将字符串 s 中的每个字母转变大小写,我们可以获得一个新的字符串。返回 所有可能得到的字符串集合。以 任意顺序 返回输出。数据量不大,可以直接暴力回溯。原创 2022-10-30 11:36:19 · 125 阅读 · 1 评论 -
2249. 统计圆内格点数目(技巧)
给你一个二维整数数组 circles ,其中 circles[i] = [xi, yi, ri] 表示网格上圆心为 (xi, yi) 且半径为 ri 的第 i 个圆,返回出现在 至少一个 圆内的 格点数目。利用公式:(x-a)²+(y-b)²原创 2022-10-19 15:12:56 · 555 阅读 · 0 评论 -
Leetcode 696. 计数二进制子串(技巧)
链接:https://leetcode.cn/problems/count-binary-substrings/solution/ji-shu-er-jin-zhi-zi-chuan-by-leetcode-solution/给定一个字符串 s,统计并返回具有相同数量 0 和 1 的非空(连续)子字符串的数量,并且这些子字符串中的所有 0 和所有 1 都是成组连续的。我们只要遍历所有相邻的数对,求它们的贡献总和,即可得到答案。重复出现(不同位置)的子串也要统计它们出现的次数。来源:力扣(LeetCode)原创 2022-10-15 11:54:11 · 227 阅读 · 0 评论 -
Leetcode 1217. 玩筹码(脑筋急转弯)
其实每次cost的值就是奇数位置的筹码移动到偶数位置和偶数位置的筹码移动到奇数位置的最小值。我们需要把所有筹码移到同一个位置。position[i] + 2 或 position[i] - 2 ,此时 cost = 0。position[i] + 1 或 position[i] - 1 ,此时 cost = 1。第 i 个筹码的位置是 position[i]。返回将所有筹码移动到同一位置上所需要的 最小代价。原创 2022-10-09 16:59:29 · 162 阅读 · 0 评论 -
892. 三维形体的表面积(技巧)
至于下边和右边的面积,由后面的柱体来减。首先,一个柱体一个柱体的看,每个柱体是由:2 个底面(上表面/下表面)+ 所有的正方体都贡献了 4 个侧表面积。输入:grid = [[1,1,1],[1,0,1],[1,1,1]]输入:grid = [[1,2],[3,4]]原创 2022-10-08 11:38:31 · 161 阅读 · 0 评论 -
LCP 18. 早餐组合(dp背包思想优化)
小扣在秋日市集选择了一家早餐摊位,一维整型数组 staple 中记录了每种主食的价格,一维整型数组 drinks 中记录了每种饮料的价格。小扣的计划选择一份主食和一款饮料,且花费不超过 x 元。请返回小扣共有多少种购买方案。注意:答案需要以 1e9 + 7 (1000000007) 为底取模,如:计算初始结果为:1000000008,请返回 1。本题用暴力会超时,因为数据量是10的5次方。暴力是N^2的复杂度。如果这样的话,就可以省去一层循环了。因此我们需要一个O(n)的算法。原创 2022-10-07 14:19:49 · 100 阅读 · 0 评论 -
976. 三角形的最大周长(巧妙的贪心+排序)
如果 A[i-2] + A[i-1] A[i]了 (j原创 2022-10-07 13:49:16 · 158 阅读 · 0 评论 -
Leetcode 最多删除一个字符得到回文(双指针,思路棒)
每次判断两个指针指向的字符是否相同,如果相同,则更新指针,将 low + 1,high - 1,然后判断更新后的指针范围内的子串是否是回文字符串。如果两个指针指向的字符不同,则两个字符中必须有一个被删除,此时我们就分成两种情况:即删除左指针对应的字符,留下子串 s[low+1:high],或者删除右指针对应的字符,留下子串 s[low:high−1]。定义左右指针,初始时分别指向字符串的第一个字符和最后一个字符,每次判断左右指针指向的字符是否相同,如果不相同,则不是回文串;) 的,会超出时间限制。原创 2022-10-04 20:01:03 · 249 阅读 · 0 评论 -
Leetcode 1640. 能否连接形成数组
给你一个整数数组 arr ,数组中的每个整数 互不相同。另有一个由整数数组构成的数组 pieces,其中的整数也 互不相同。请你以 任意顺序 连接 pieces 中的数组以形成 arr。但是,不允许 对每个数组 pieces[i] 中的整数重新排序。如果可以连接 pieces 中的数组形成 arr ,返回 true;否则,返回 false。记录每一个pieces中首元素的下标。原创 2022-10-04 18:45:14 · 135 阅读 · 0 评论 -
剑指 Offer II 024. 反转链表(原地修改)
在遍历链表时,将当前节点的指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。本题要设计一个时间复杂度O(n), 空间复杂度O(1)的算法来反转链表。输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]原创 2022-10-03 14:46:07 · 226 阅读 · 0 评论 -
剑指 Offer II 002. 二进制加法(模拟)
给定两个 01 字符串 a 和 b ,请计算它们的和,并以二进制字符串的形式输出。这个函数可以记下来,以后用到可以直接copy。输入为 非空 字符串且只包含数字 1 和 0。原创 2022-09-28 14:25:07 · 174 阅读 · 0 评论 -
Leetcode 6189. 按位与最大的最长子数组(DP)
换句话说,令 k 是 nums 任意 子数组执行按位与运算所能得到的最大值。那么,只需要考虑那些执行一次按位与运算后等于 k 的子数组。考虑 nums 中进行 按位与(bitwise AND)运算得到的值 最大 的 非空 子数组。第i位的按位与最大值,要么是在前一位的基础上与运算,要么是自己本身。数组的按位与就是对数组中的所有数字进行按位与运算。给你一个长度为 n 的整数数组 nums。借助了动态规划:最长递增子数组的思想。返回满足要求的 最长 子数组的长度。子数组 是数组中的一个连续元素序列。原创 2022-09-25 12:32:20 · 222 阅读 · 0 评论 -
Leetcode 788. 旋转数字
如果一个数的每位数字被旋转以后仍然还是一个数字, 则这个数是有效的。0, 1, 和 8 被旋转后仍然是它们自己;2 和 5 可以互相旋转成对方(在这种情况下,它们以不同的方向旋转,换句话说,2 和 5 互为镜像);6 和 9 同理,除了这些以外其他的数字旋转以后都不再是有效的数字。我们称一个数 X 为好数, 如果它的每位数字逐个地被旋转 180 度后,我们仍可以得到一个有效的,且和 X 不同的数。要求每位数字都要被旋转。现在我们有一个正整数 N, 计算从 1 到 N 中有多少个数 X 是好数?原创 2022-09-25 12:22:45 · 145 阅读 · 0 评论 -
1740. 找到二叉树中的距离(DFS)
给定一棵二叉树的根节点 root 以及两个整数 p 和 q ,返回该二叉树中值为 p 的结点与值为 q 的结点间的 距离。也可以借助前面实现的求最近公共祖先的方法。如果能求出祖先,再直接去求两边的距离也可以。两个结点间的 距离 就是从一个结点到另一个结点的路径上边的数目。1、遍历每一个节点,看其能否到达p,q两个目标节点。如果都可以到达的情况下,保存一个距离的最小值。原创 2022-09-23 09:52:51 · 223 阅读 · 0 评论 -
6182. 反转二叉树的奇数层(层次遍历)
例如,假设第 3 层的节点值是 [2,1,3,4,7,11,29,18] ,那么反转后它应该变成 [18,29,11,7,4,3,1,2]。用层次遍历,拿到每一层的序列。然后把奇数层用链表串起来,将问题转化为逆置链表即可。可以直接在树上进行修改。给你一棵 完美 二叉树的根节点 root ,请你反转这棵树中每个 奇数 层的节点值。完美 二叉树需满足:二叉树的所有父节点都有两个子节点,且所有叶子节点都在同一层。节点的 层数 等于该节点到根节点之间的边数。反转后,返回树的根节点。原创 2022-09-18 12:01:46 · 311 阅读 · 0 评论 -
Leetcode 340. 至多包含 K 个不同字符的最长子串(滑动窗口)
给你一个字符串 s 和一个整数 k ,请你找出 至多 包含 k 个 不同 字符的最长子串,并返回该子串的长度。注意时间复杂度的控制,如果无脑O(n^2)会超时。我这里用hash优化到了O(n)原创 2022-09-18 11:59:53 · 243 阅读 · 0 评论 -
Leetcode 删除有序数组中的重复项(I, II两题)
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。将最终结果插入 nums 的前 k 个位置后返回 k。原创 2022-09-17 16:22:54 · 135 阅读 · 0 评论 -
416. 分割等和子集(dp01背包,深刻理解动态规划)
给你一个 只包含正整数 的 非空 数组 nums。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。因此,我们定义dp[i][val] 表示前i个物品,能否凑出重量为val的这种方案。如果dp[i][val] = 1表示可以凑出,等于0表示不能凑出。因为要求是分成两个等和子集,所以其实我们可以理解为,本题思路非常巧妙,将其转成01背包的动态规划。经过本题之后,确实感觉对动态规划更有感觉了。状态转移:基本上和01背包一样的思想。原创 2022-09-17 15:32:03 · 158 阅读 · 0 评论 -
Leetcode 253. 会议室 II(上下车问题)
给你一个会议时间安排的数组 intervals ,每个会议时间都会包括开始和结束的时间 intervals[i] = [starti, endi] ,返回 所需会议室的最小数量。这样可以把上车和下车的时间分成两组,通过两个指针滑动的方式,判断同时在车上的最大数就可以了。不用在意是谁上车还是下车,只需要注意什么时候上下车就可以。【思路】:本题思路非常好,称为。原创 2022-09-17 14:29:16 · 496 阅读 · 0 评论 -
250. 统计同值子树(二叉树)
遍历每个节点,看每个节点形成的树是否都是同值的。如果是,就res++即可。给定一个二叉树,统计该二叉树数值相同的子树个数。同值子树是指该子树的所有节点都拥有相同的数值。原创 2022-09-17 13:06:33 · 573 阅读 · 0 评论 -
面试题 17.10. 主要元素(摩尔投票)
数组中占比超过一半的元素称之为主要元素。给你一个 整数 数组,找出其中的主要元素。若没有,返回 -1。请设计时间复杂度为 O(N) 、空间复杂度为 O(1) 的解决方案。大致思想是如果有不同的就相互抵消,最后剩下来的那个x是可能的值。这个算法在求主要元素,或占比比较大的元素时具有很好的效果。所以最后还得检验一遍。原创 2022-09-17 12:45:05 · 96 阅读 · 0 评论 -
面试题 17.09. 第 k 个数(技巧)
链接:https://leetcode.cn/problems/get-kth-magic-number-lcci/solution/di-k-ge-shu-jiu-shi-xiang-bu-tong-wei-he-san-zhi-z/例如,前几个数按顺序应该是 1,3,5,7,9,15,21。定义三个index 分别指向上面三个数列,下一个丑数一定是三个 index 代表的值中最小的那个。反过来说也是一样的,一个丑数 x3 / x5 / x7 就会得到某一个更大的丑数。来源:力扣(LeetCode)原创 2022-09-17 12:10:46 · 231 阅读 · 0 评论 -
剑指 Offer 16. 数值的整数次方(思路妙)
实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。原创 2022-09-16 13:49:53 · 98 阅读 · 0 评论 -
剑指 Offer 04. 二维数组中的查找(二分技巧)
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。如果目标比右上角元素大,则往下搜。如果目标比右上角元素小,则往左搜。可以用递归也可以用循环实现。此题用暴力做效率很低,虽然也发现了矩阵有序的特点,但不知如何更好的使用二分查找。所以我突然反应出来,原来右上角是一个比较的起始位置。原创 2022-09-16 13:39:01 · 119 阅读 · 0 评论 -
1343. 大小为 K 且平均值大于等于阈值的子数组数目(滑动窗口模板题)
请你返回长度为 k 且平均值大于等于 threshold 的子数组数目。给你一个整数数组 arr 和两个整数 k 和 threshold。原创 2022-09-16 12:10:02 · 75 阅读 · 0 评论 -
剑指 Offer II 085. 生成匹配的括号 (暴力回溯)
正整数 n 代表生成括号的对数,请设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。每个位置只有两种选择,放左括号或右括号。最后筛选掉不合格的括号组合。原创 2022-09-14 16:25:11 · 117 阅读 · 0 评论 -
Leetcode 231. 2 的幂(位运算)
给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true;否则,返回 false。如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。2、如果一个数要想为2的幂,必然有 (n & n-1) == 0。这是因为2的幂的数,它减一之后必然所有位(除最高位外)都是1.【思路】:循环的方法就不说了,这里主要提一提位运算的思路。1、如果某个数为负数,那么肯定不是2的幂。代码可以一行搞定了。原创 2022-09-14 12:13:53 · 81 阅读 · 0 评论 -
Leetcode 2269. 找到一个数字的 K 美丽值(滑动窗口)
给你整数 num 和 k ,请你返回 num 的 k 美丽值。一道很明显的滑动窗口题。这个技巧学会之后解这类问题确实非常容易。一个 子字符串 是一个字符串里的连续一段字符序列。子字符串能整除 num。子字符串长度为 k。允许有 前缀 0。0 不能整除任何值。原创 2022-09-13 18:58:38 · 217 阅读 · 0 评论 -
剑指 Offer II 008. 和大于等于 target 的最短子数组(滑动窗口)
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0。给定一个含有 n 个正整数的数组和一个正整数 target。原创 2022-09-13 18:50:08 · 88 阅读 · 0 评论 -
239. 滑动窗口最大值(滑动窗口)
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。如果最大值还存在于窗口内部,其实就可以根据情况直接过。每次只需要比较新加入的nums[right]和max谁大即可。当left > maxindex时,即最大值已经离开滑动窗口了,那么就得从头更新一遍最大值了。我发现其实并不是每次都要从头搜整个窗口内的元素。返回 滑动窗口中的最大值。原创 2022-09-13 15:46:34 · 133 阅读 · 0 评论 -
1387. 将整数按权重排序(记忆化搜索)
你的任务是将区间 [lo, hi] 之间的整数按照它们的权重 升序排序 ,如果大于等于 2 个整数有 相同 的权重,那么按照数字自身的数值 升序排序。因为 3 需要 7 步变成 1 (3 --> 10 --> 5 --> 16 --> 8 --> 4 --> 2 --> 1)。12 的权重为 9(12 --> 6 --> 3 --> 10 --> 5 --> 16 --> 8 --> 4 --> 2 --> 1)搜的过程中如果把6的结果记录下来,那么12就是在它的基础上加1即可。原创 2022-09-13 13:24:31 · 92 阅读 · 0 评论 -
剑指 Offer II 043. 往完全二叉树添加节点(层次遍历)
CBTInserter.insert(int v) 向树中插入一个新节点,节点类型为 TreeNode,值为 v。使树保持完全二叉树的状态,并返回插入的新节点的父节点的值;完全二叉树是每一层(除最后一层外)都是完全填充(即,节点数达到最大,第 n 层有 2n-1 个节点)的,并且所有的节点都尽可能地集中在左侧。CBTInserter(TreeNode root) 使用根节点为 root 的给定树初始化该数据结构;CBTInserter.get_root() 将返回树的根节点。这样找父亲的话会非常方便。原创 2022-09-11 12:42:43 · 304 阅读 · 0 评论 -
Leetcode 628. 三个数的最大乘积
然后如果有负数产生最大值,必然是负数的个数大于等于2,且最小的两个负数乘一个最大的正数,这个值称为fumax。给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。所以我是这样想的,首先取出三个最大的数相乘:作为zhengmax。如果单纯排序取最大的三个数相乘,又会有负数的情况。最后比较zhengmax 和fumax谁大即可。常规思路三重循环超时。原创 2022-09-10 17:20:01 · 118 阅读 · 0 评论 -
Leetcode 669. 修剪二叉搜索树
给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。可以证明,存在 唯一的答案。所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。递归即可,不用想复杂了。原创 2022-09-10 14:42:21 · 69 阅读 · 0 评论 -
Leetcode 1395. 统计作战单位数 (DP)
作战单位需满足: rating[i] < rating[j] < rating[k] 或者 rating[i] > rating[j] > rating[k] ,其中 0原创 2022-09-10 14:05:23 · 80 阅读 · 0 评论 -
剑指 Offer II 092. 翻转字符(DP,详细分析)
如果一个由 ‘0’ 和 ‘1’ 组成的字符串,是以一些 ‘0’(可能没有 ‘0’)后面跟着一些 ‘1’(也可能没有 ‘1’)的形式组成的,那么该字符串是 单调递增 的。我们给出一个由字符 ‘0’ 和 ‘1’ 组成的字符串 s,我们可以将任何 ‘0’ 翻转为 ‘1’ 或者将 ‘1’ 翻转为 ‘0’。如果我这一位是1,想翻1串,那么两种情况:1、前面i-1位翻成1串,然后我不用动。如果想翻1串,那么有两种情况:第一种情况、前面i-1位翻成1串,然后我也翻一下:即dp[i-1].one + 1。原创 2022-09-09 18:07:23 · 196 阅读 · 0 评论