![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法刷题
文章平均质量分 63
xiaobai12 3
这个作者很懒,什么都没留下…
展开
-
74. 搜索二维矩阵【二分法】【C++】
1的一维数组,最中间的数mid是5((0+12-1) / 2 == 5),对应二维数组行数1(5 / 4==1),列数5(5 % 4 == 1)。输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13。输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3。本题是二分搜索的变形,常规的二分搜索是一个一维数组,而本题是一个。,但是依然可以使用一维数组的思路,原创 2024-07-05 23:44:18 · 410 阅读 · 0 评论 -
203. 移除链表元素【链表】【C++】
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点。就是跳过下一个的节点,直接和下一个的下一个节点相连,但需要注意,C++需要手动释放内存。输入:head = [1,2,6,3,4,5,6], val = 6。输入:head = [7,7,7,7], val = 7。列表中的节点数目在范围 [0, 104] 内。输入:head = [], val = 1。时间复杂度O(n):遍历一遍链表。输出:[1,2,3,4,5]原创 2024-06-27 10:06:20 · 325 阅读 · 0 评论 -
904. 水果成篮【滑动窗口】【C++】
考虑滑动窗口,用一个哈希表存贮窗口内出现数字的次数,当哈希表出现的个数为3时,窗口左侧收缩,并且对应的个数减1,如果某个数字的次数为0时,删除对应的元素。输入:fruits = [3,3,3,1,2,1,1,2,3,3,4]如果从第一棵树开始采摘,则只能采摘 [1,2] 这两棵树。解释:可以采摘 [1,2,1,1,2] 这五棵树。输入:fruits = [1,2,3,2,2]解释:可以采摘 [2,3,2,2] 这四棵树。输入:fruits = [0,1,2,2]解释:可以采摘 [1,2,2] 这三棵树。原创 2024-06-26 20:33:38 · 328 阅读 · 0 评论 -
844. 比较含退格的字符串【栈】【C++】
使用两个指针分别指向两个字符串的末尾,从后往前遍历字符串,遇到’#‘就删除一个元素,直到当前没’#',然后比较当前字母。生成去掉’#‘后的字符串:使用栈(字符串来模拟)来完成,遇到’#‘且栈非空就出栈,不是’#'就入栈。分别生成两个字符串,然后比较两个字符串是否相等(时间复杂度O(n))。输入:s = “ab#c”, t = “ad#c”输入:s = “ab##”, t = “c#d#”解释:s 会变成 “c”,但 t 仍然是 “b”。输入:s = “a#c”, t = “b”原创 2024-06-26 11:04:26 · 297 阅读 · 0 评论 -
122. 买卖股票的最佳时机 II【C++】【贪心法】【动态规划法】
思路:由于可以当天卖出后当天买入,所以我们可以进行拆分如:price[3] - price[0] = (price[3] - price[2]) + (price[2] - price[1]) + (price[1] - price[0])解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。区别在于能不能多次购买,所以昨天不持有股票而今天买入股票为dp[i - 1][1] - prices[i]。原创 2024-06-12 15:51:11 · 420 阅读 · 0 评论 -
买卖股票的最佳时机【C++】
买卖股票的最佳时机有很多变形题,他们有的可以暴力、贪心等方法求解,但是都可以用动态规划的思路进行求解,需要重点掌握。原创 2024-06-11 10:48:47 · 658 阅读 · 0 评论 -
343. 整数拆分【贪心】【动态规划】【C++】
想要拆分的整数乘积最大,尽量多拆成几个整数,但拆成几个整数合适?不能继续拆分的整数我们从小到大分析,2和3拆分会变小,4拆分不变。选择不能拆分的最大值3作为拆分的最小单元,但剩下的4不能拆分为3*1。给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。8 = 3 + 3 + 2(不能3 + 5,5拆分会变大)解释: 2 = 1 + 1, 1 × 1 = 1。输入: n = 10。原创 2024-06-06 20:31:57 · 347 阅读 · 0 评论 -
不同路径相关问题【C++】【动态规划】
不同于第一题,本题加入了障碍,但是(i,j)的路径数依旧由(i-1,j)和(i,j-1)有关,所以依旧考虑使用动态规划方法,只是需要修改递归公式等内容。一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]现在考虑网格中有障碍物。输入:obstacleGrid = [[0,1],[0,0]]原创 2024-06-01 14:29:22 · 917 阅读 · 0 评论 -
爬楼梯相关问题
给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。到第i层的花费与i-1层的花费和i-2层的花费有关,因此本题也可以尝试使用动态规划方法。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。i-1层的最小花费和i-2层最小花费的最小值。只循环使用了3个变量,因此可以不用n维数组。解释:你将从下标为 1 的台阶开始。解释:有两种方法可以爬到楼顶。解释:有三种方法可以爬到楼顶。原创 2024-05-30 21:02:05 · 895 阅读 · 0 评论 -
斐波那契数【C++】【多解法】
递归法:从上到下计算动态规划:从下到上计算。原创 2024-05-29 10:42:32 · 409 阅读 · 0 评论 -
151. 反转字符串中的单词【C++】
输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。s 中使用至少一个空格将字符串中的 单词 分隔开。解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。给你一个字符串 s ,请你反转字符串中 单词 的顺序。解释:反转后的字符串中不能存在前导空格和尾随空格。输入:s = “a good example”原创 2024-05-28 11:24:50 · 237 阅读 · 0 评论 -
541. 反转字符串 II【C++】
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。如果剩余字符少于 k 个,则将剩余字符全部反转。输入:s = “abcdefg”, k = 2。输入:s = “abcd”, k = 2。输出:“bacdfeg”s 仅由小写英文组成。原创 2024-05-28 10:21:54 · 304 阅读 · 0 评论 -
打家劫舍【动态规划】
因为当前值与以前值有关,所以可以尝试动态规划。动态规划每道题都可以用这5步进行解决,每一步都很重要。代码随想录。原创 2024-05-22 13:37:13 · 246 阅读 · 1 评论 -
344.反转字符串(C++)
使用reverse()函数直接反转,但这题比较简单,不推荐使用。原创 2024-05-17 09:10:38 · 237 阅读 · 1 评论 -
JZ81 调整数组顺序使奇数位于偶数前面(二)(C++)
3.再次遍历原数组,是奇数就从res数组的下标0开始赋值,偶数就放在index开始赋值。2.第一个指针向后移动,遇到偶数就停下,第二个指针向前移动到奇数就停下,然后交换两个数。1.然后使用双指针,一个指向数组首,一个指向数组尾。3.重复步骤3,知道第一个指针大于第二个指针。1.首先遍历一遍数组,确定奇数个数index。2.创建一个结果数组res。原创 2024-05-14 20:22:37 · 167 阅读 · 2 评论 -
977.有序数组的平方(C++)
两侧指针的平方一定大于中间的平方,所以两侧向中间以动就行。时间复杂度:快速排序,O(nlogn)空间复杂度O(n):创建了一个辅助数组。时间复杂度O(n):遍历一遍数组。空间排序:原数组操作,O(1)原创 2024-05-14 09:08:21 · 206 阅读 · 1 评论 -
数组:移除元素(C++)
遍历数组每一个元素,如果这个值和目标值相等,则删除该元素。但是数组因为是连续的,所以需要遍历的将后一个值赋给前一个值。因此有两层遍历,时间复杂度O(n^2)、空间复杂度O(1)对于数组、链表、字符串等数据结构,我们常常使用双指针的方法。双指针中的快慢指针最为合适,其中慢指针指向当前马上添加的位置,快指针去遍历数组。不能i < nums.size(),因为要遍历完原数组长度,而不是变化中的数组。删除数组元素也可以使用erase方法,时间复杂度是一样的。原创 2024-05-13 15:00:50 · 707 阅读 · 0 评论 -
54. 螺旋矩阵
首先怎么判断可能剩一行还是一列?行数<列数就是剩一行,大于也同理。等于可以任意归为一类,比如3*3的矩阵。,依然同样的模拟方式,但区别是行数和列数不等。比如最后可能剩一列或者一行,需要单独处理。其次怎么判断是否有剩余?取行数和列数的最小值,如果满足以下就说明有剩,需要单独处理。原创 2024-05-13 14:35:47 · 211 阅读 · 0 评论 -
59. 螺旋矩阵 II(C++)
这道题不涉及算法,只是进行模拟一个过程。但是在模拟时会出现很多问题,比如:循环转圈多少次?、边界怎么处理等等。每条边的终点由一个变量控制,因为它随着圈数而改变;如果n为奇数还需要单独处理中间位置。原创 2024-05-13 11:28:24 · 171 阅读 · 0 评论 -
二分查找以及相关问题(c++)
本文简单介绍了二分查找以及几种变形问题,关键就是如何缩小查询的范围。希望大家对二分法有更深的理解。原创 2024-05-10 21:14:38 · 265 阅读 · 0 评论 -
翻转二叉树(c++)
分析二叉树问题可以先画个图,理清思路。二叉树翻转4种遍历方式都可以(都是O(n)、O(n)复杂度),唯独中序有变化,不方便。原创 2024-05-09 15:44:08 · 293 阅读 · 1 评论