算法/力扣刷题
文章平均质量分 70
力扣刷题笔记和算法心得整理
独行的喵
这个作者很懒,什么都没留下…
展开
-
力扣18.四数之和
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target。输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]输入:nums = [1,0,-1,0,-2,2], target = 0。输入:nums = [2,2,2,2,2], target = 8。你可以按 任意顺序 返回答案。a、b、c 和 d 互不相同。输出:[[2,2,2,2]]原创 2023-02-24 16:35:57 · 1835 阅读 · 0 评论 -
力扣79.单词搜索
输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED”输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCB”输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “SEE”原创 2023-02-23 10:53:54 · 195 阅读 · 0 评论 -
力扣62.不同路径
使用最经典的深搜dfs模板搜索全部路线,每搜索到一个路线让全局变量count++,最终返回count,但由于其指数级的时间复杂度最终导致结果超时。思路:对于一个位置(i,j)的到达路线数,等于其正上方位置:(i-1,j)路线数加上其左边位置:(i,j-1)路线数之和。一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。输入:m = 3, n = 7。输入:m = 3, n = 2。输入:m = 7, n = 3。输入:m = 3, n = 3。原创 2023-02-19 10:07:03 · 457 阅读 · 0 评论 -
力扣38.外观数列
最简单易懂的方法,直接按照题目所给规则从1到n顺序生成所需要的外观序列,虽然思路及其简单但在用C语言实现上比较繁琐。原创 2023-02-18 18:46:53 · 480 阅读 · 0 评论 -
力扣56.合并区间
如果当前区间的左端点在数组 merged 中最后一个区间的右端点之后,那么它们不会重合,我们可以直接将这个区间加入数组 merged 的末尾;否则,它们重合,我们需要用当前区间的右端点更新数组 merged 中最后一个区间的右端点,将其置为二者的较大值。输入:intervals = [[1,3],[2,6],[8,10],[15,18]]解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].输出:[[1,6],[8,10],[15,18]]输出:[[1,5]]原创 2023-02-17 16:47:14 · 590 阅读 · 0 评论 -
力扣53.最大子数组和
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。输入:nums = [-2,1,-3,4,-1,2,1,-5,4]这里dp[i]表示:选取位置i的数作为结尾的情况下能达到的最大的和。解释:连续子数组 [4,-1,2,1] 的和最大,为 6。输入:nums = [5,4,-1,7,8]上面两种情况就对应了以下状态转移方程。子数组 是数组中的一个连续部分。输入:nums = [1]原创 2023-02-17 11:27:13 · 331 阅读 · 0 评论 -
力扣24.两两交换链表中的节点
递归函数中其中一个重大的作用就是为它的上一级调用函数返回需要的节点作为上一级递归中的下一个节点,我们暂存这个节点,在需要结束时返回给上一级函数。给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。并且根据规律,本节点的前驱节点也应改成本节点的原后继节点,即上面暂存的节点P。链表中节点的数目在范围 [0, 100] 内。输入:head = [1,2,3,4]输入:head = [1]输出:[2,1,4,3]原创 2023-02-15 11:52:59 · 316 阅读 · 0 评论 -
力扣402题移掉k位数字
笔者是小白,自己想出来的代码如下:char * removeKdigits(char * num, int k){ int length=strlen(num); if(length==k) return "0"; int j=k,i; int a[length-k]; char *result=(char *)malloc(sizeof(char)*(length-k+1)); for(i=0;i<length-k;i++) { ..原创 2022-02-08 16:40:28 · 7236 阅读 · 0 评论 -
力扣16.最接近的三数之和
给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在恰好一个解。示例 1:输入:nums = [-1,2,1,-4], target = 1输出:2解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2)。原创 2023-01-13 17:42:48 · 539 阅读 · 0 评论 -
力扣98.验证二叉搜索树
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。输入:root = [5,1,4,null,null,3,6]解释:根节点的值是 5 ,但是右子节点的值是 4。所有左子树和右子树自身必须也是二叉搜索树。节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。树中节点数目范围在[1, 104] 内。输入:root = [2,1,3]原创 2023-01-21 15:32:50 · 1597 阅读 · 0 评论 -
力扣12.整数转罗马数字
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II。27 写做 XXVII, 即为 XX + V + II。通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4。同样地,数字 9 表示为 IX。原创 2023-01-12 14:35:04 · 104 阅读 · 0 评论 -
力扣22.括号生成
另外注意在使用递归写法写回溯算法时,对于每一个递归函数内的传递变量,最好不要在函数内改变它们的值,而是在传入下一个递归函数时再改变,例如本题dfs函数中的:left,right,index这些参数。所以例如:dfs(left+1,right,result,index+1,n,returnSize);而不是:left++;输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]原创 2023-02-10 22:27:37 · 121 阅读 · 0 评论 -
力扣39.组合总数
给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。2 和 3 可以形成一组候选,2 + 2 + 3 = 7。输入:candidates = [2,3,6,7], target = 7。输入: candidates = [2,3,5], target = 8。输出: [[2,2,2,2],[2,3,3],[3,5]]输出:[[2,2,3],[7]]原创 2023-02-13 21:02:46 · 438 阅读 · 0 评论 -
力扣121.买股票最佳时机
这里唯一需要区别于其他力扣股票问题的细节是,由于只能买一次卖一次,所以第i天持股状态情形变化为:第i天当天买入股票时,前面并无累计金额,因为前面不会有更早的买卖交易出现了。题目中代码细节实现为: f[i][0]=fmax(f[i-1][0],f[i-1][1]-prices[i]);而本题中采用: f[i][0]=fmax(f[i-1][0],-prices[i]);解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5。原创 2023-02-01 23:10:00 · 216 阅读 · 0 评论 -
力扣64.最小路径和
给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。即dp[i][j]是从左边临近位置走来的路径花费和从上边临近位置走来的路径花费比较中的最小者。输入:grid = [[1,3,1],[1,5,1],[4,2,1]]根据此状态转移方程,并给dp[0][0]赋初始值为grid[0][0]以数组dp[i][j]表示:走到位置i,j的最小路径花费。输入:grid = [[1,2,3],[4,5,6]]解释:因为路径 1→3→1→1→1 的总和最小。原创 2023-02-09 10:42:18 · 324 阅读 · 0 评论 -
力扣36.有效的数独
解释:除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。board[i][j] 是一位数字(1-9)或者 ‘.’只需要根据以上规则,验证已经填入的数字是否有效即可。一个有效的数独(部分已被填充)不一定是可解的。数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。输入:board =原创 2023-01-18 16:25:57 · 546 阅读 · 0 评论 -
力扣45.跳跃游戏Ⅱ(贪心思路详解)
从最后一个位置开始遍历,并选定该位置作为目标位置,然后从前向后查找出第一个能跳到这个位置的位置,即距离目标位置最远的位置,作为上一跳的起跳位置,然后更新这个起跳位置为目标位置,再选定这个新的目标位置,继续从前往后查找,找到距离这个新目标位置最远的起跳位置,且该起跳位置保证可以跳到新的目标位置,重复该过程直到使起跳位置变成第一个位置,返回步数。例如,对于数组 [2,3,1,2,4,2,3],初始位置是下标 0,从下标 0 出发,最远可到达下标 2。输入: nums = [2,3,1,1,4]原创 2023-01-20 19:11:20 · 772 阅读 · 0 评论 -
力扣123.买卖股票的最佳时机Ⅲ&买卖股票的最佳时机Ⅳ
解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4。随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (股票价格 = 4)的时候卖出,这笔交易所能获得利润 = 4-1 = 3。解释:在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3。输入:prices = [3,3,5,0,0,3,1,4]持股,第一次持股,f2。原创 2023-02-03 10:33:35 · 226 阅读 · 0 评论 -
力扣309.最佳买股票时机含冷冻期
给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。原创 2023-02-01 21:04:29 · 105 阅读 · 0 评论 -
力扣8.字符串转换整数(比较简单)
具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1。将前面步骤读入的这些数字转换为整数(即,“123” -> 123, “0032” -> 32)。第 2 步:“4193 with words”(当前没有读入字符,因为这里不存在 ‘-’ 或者 ‘+’)字符串的其余部分将被忽略。由于 “-42” 在范围 [-231, 231 - 1] 内,最终结果为 -42。第 2 步:“42”(当前没有读入字符,因为这里不存在 ‘-’ 或者 ‘+’)原创 2023-01-17 16:58:52 · 594 阅读 · 0 评论 -
力扣33.搜索旋转排序数组
在传递给函数之前,nums 在预先未知的某个下标 k(0原创 2023-02-11 15:41:57 · 410 阅读 · 1 评论 -
力扣55.跳跃游戏(比较简单)
解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。给定一个非负整数数组 nums ,你最初位于数组的 第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。输入:nums = [2,3,1,1,4]输入:nums = [3,2,1,0,4]判断你是否能够到达最后一个下标。原创 2023-01-19 15:41:39 · 887 阅读 · 0 评论 -
打家劫舍1
打家劫舍1一种最容易想到的,用类似深搜的方法来解决的低效算法:#include<stdio.h>#include<stdlib.h>//深搜解决打家劫舍问题 int dp(int start,int n,int nums[]){ if(start>=n) return 0; return dp(start+1,n,nums)>=nums[start]+dp(start+2,n,nums)?dp(start+1,n,nums):nums[start]+d原创 2021-06-17 12:01:06 · 124 阅读 · 0 评论 -
单调栈——力扣84题
单调栈我们从力扣84题的解决思路中引出单调栈的概念,首先看力扣84题的题目描述如下:关于暴力解:这道题是要寻找最大的而矩形区域,暴力的解法是:以每一个柱子为基准,寻找包含该柱子的最大矩形区域。即遍历到每一个柱子时,寻找以它的高度为高,宽度最大的矩形。这样的做法十分简单,但是遍历柱子的时间复杂度是O(N),而寻找包含每一根柱子的矩形最大宽度的时间复杂度也是O(N),这样一来总的算法的时间复杂度是O(N^2)算法的改进:能否将该问题的时间复杂度缩减到O(N)?即我们尽可能地通过一次对所有柱子的遍历来解决问原创 2021-12-15 11:59:08 · 5192 阅读 · 0 评论