
Leetcode 刷题笔记
文章平均质量分 95
刷题过程中记录的解题思路,方便自己再次查看,也是对自己学习的记录与监督,也可以供其他的同学学习参考。如果有任何写的不对的地方请在评论区指点讨论。
Perrysky
喜欢编程
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Leetcode746.使用最小花费爬楼梯(简单)动态规划 贪心 C++
题目描述: 746. 使用最小花费爬楼梯 数组的每个索引作为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 costi。 每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯。 您需要找到达到楼层顶部的最低花费。在开始时,你可以选择从索引为 0 或 1 的元素作为初始阶梯。 示例 1: 输入: cost = [10, 15, 20] 输出: 15 解释: 最低花费是从cost[1]开始,然后走两步即可到阶梯顶,一共花费15。 示例 2: 输入: cost = [1,原创 2020-12-22 21:30:04 · 362 阅读 · 0 评论 -
Leetcode96.不同的二叉搜索树(中等)C++ 递归 动态规划
题目描述: 96. 不同的二叉搜索树 给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种? 示例: 输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \ 3 2 1 1 3 2 / / \ 2 1 2原创 2020-12-17 22:24:53 · 259 阅读 · 0 评论 -
Leetcode98.验证二叉搜索树(中等)C++ 数组 递归 迭代
题目描述: 98. 验证二叉搜索树 给定一个二叉树,判断其是否是一个有效的二叉搜索树。 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 示例 1: 输入: 2 / 1 3 输出: true 示例 2: 输入: 5 / 1 4 / 3 6 输出: false 解释: 输入为: [5,1,4,null,null,3,6]。 根节点的值为 5 ,但是其右子节点值为 4 。 思路描述: 首先一原创 2020-12-17 20:20:19 · 310 阅读 · 3 评论 -
Leetcode45.跳跃游戏II(困难)C++ 贪心
题目描述 45. 跳跃游戏 II 给定一个非负整数数组,你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 你的目标是使用最少的跳跃次数到达数组的最后一个位置。 示例: 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2。 从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。 思路描述 // 以最小的步数得到最大的覆盖范围(即数组的最后位置) // 思路是 用局部最优得到全局最优,即当前的每一步都尽量走最大原创 2020-12-12 22:14:00 · 286 阅读 · 0 评论 -
Leetcode122.买卖股票的最佳时机II (简单)贪心思想 C++
题目概述: 122. 买卖股票的最佳时机 II 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 示例 1: 输入: [7,1,5,3,6,4] 输出: 7 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 随后,在第 4 天(股票价格 =原创 2020-12-08 20:23:53 · 199 阅读 · 0 评论 -
leetcode55.跳跃游戏(贪心思想)多个解法 C++
Leetcode 55.跳跃游戏 题目描述: 给定一个非负整数数组,你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个位置。 示例 1: 输入: [2,3,1,1,4] 输出: true 解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。 示例 2: 输入: [3,2,1,0,4] 输出: false 解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不原创 2020-12-08 19:43:30 · 307 阅读 · 0 评论 -
动态规划问题的学习思路总结
动态规划问题的学习思路总结 1、由斐波那契数列引入重叠子问题(斐波那契数列严格来说不是动态规划问题) 1)暴力递归 int fib(int n) { if( n ==1 || n == 2) return 1; return fib(n-1) + fib(n-2); } 时间复杂度为:O(2^n) 画出递归树: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fpsBQRSE-1600873191052)(C:\Users\Perry\AppD原创 2020-09-23 23:01:23 · 335 阅读 · 0 评论 -
Leetcode 面试题 08.11 硬币 (中等) 动态规划(完全背包问题)
题目描述: 硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007) 示例1: 输入: n = 5 输出:2 解释: 有两种方式可以凑成总金额: 5=5 5=1+1+1+1+1 示例2: 输入: n = 10 输出:4 解释: 有四种方式可以凑成总金额: 10=10 10=5+5 10=...原创 2020-04-30 18:30:53 · 347 阅读 · 0 评论 -
Leetcode 24. 两两交换链表中的节点(中等) 递归法与非递归法(迭代法)
题目描述: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3. 来源:力扣(LeetCode) 思路: 1、迭代法整个思路是, pre,now,nex, nex->next; ...原创 2020-04-27 21:38:23 · 253 阅读 · 0 评论 -
leetcode 234. 回文链表(简单) 快慢指针 和 栈
题目描述: 请判断一个链表是否为回文链表。 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用O(n) 时间复杂度和 O(1) 空间复杂度解决此题? 思路: 首先想到的是: 用栈存下链表的所有结点值,然后链表头开始的遍历与栈顶元素比较,相等就出栈,继续移动比较,否则返回false (可...原创 2020-04-24 20:49:23 · 314 阅读 · 1 评论 -
Leetcode 206. 反转链表(简单) 递归法 和 迭代法
题目描述: 反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题? 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reverse-linked...原创 2020-04-24 17:27:48 · 326 阅读 · 0 评论 -
Leetcode 92.反转链表II (中等)(递归反转单链表的一部分)
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* successor = NULL; //存放后驱节点 struct ListNode* reverseN(struct Li...原创 2020-03-19 22:55:55 · 309 阅读 · 0 评论 -
Leetcode 1290. 二进制链表转整数(简单) 位运算 的应用
题目描述: 给你一个单链表的引用结点head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。 请你返回该链表所表示数字的 十进制值 。 示例 1: 输入:head = [1,0,1] 输出:5 解释:二进制数 (101) 转化为十进制数 (5) 示例 2: 输入:head = [0] 输出:0 示例 3: 输入:head = [1] 输出...原创 2020-04-24 16:42:18 · 221 阅读 · 0 评论 -
Leetcode 82. 删除重复的数字(中等) 双指针
题目描述: 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中没有重复出现的数字。 示例1: 输入: 1->2->3->3->4->4->5 输出: 1->2->5 示例2: 输入: 1->1->1->2->3 输出: 2->3 思路: 用一个空指针指向链表头,然后通过 slow 和 fa...原创 2020-04-24 16:15:47 · 245 阅读 · 0 评论 -
Leetcode 429. N叉树的层次遍历(中等) 队列实现层次遍历 C++
题目描述: 给定一个 N 叉树,返回其节点值的层序遍历。 (即从左到右,逐层遍历)。 例如,给定一个3叉树: 返回其层序遍历: [ [1], [3,2,4], [5,6] ] 说明: 树的深度不会超过1000。 树的节点总数不会超过5000。 思路: 首先用一个队列来存储每一个树结点。通过两层循环, 第一层用来保证队列不空,即能够遍历所有...原创 2020-04-20 15:25:10 · 315 阅读 · 0 评论 -
Leetcode110. 平衡二叉树(简单)DFS 递归法
题目描述: 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。 示例 1: 给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7 返回 true 。 示例 2: 给定二叉树 [1,2,2,3,3,null...原创 2020-04-20 14:50:47 · 211 阅读 · 0 评论 -
Leetcode 559. N 叉树的最大深度(简单)C语言 递归法、DFS、BFS 三种解法
题目描述: 给定一个 N 叉树,找到其最大深度。 最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。 例如,给定一个3叉树: 我们应返回其最大深度,3。 说明: 树的深度不会超过1000。 树的节点总不会超过5000。 思路: 1、递归法 /** * Definition for a Node. * struct Node { * ...原创 2020-04-18 11:22:37 · 446 阅读 · 0 评论 -
Leetcode 104. 二叉树的最大深度(简单) 递归思路
题目描述: 给定一个二叉树,找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明:叶子节点是指没有子节点的节点。 示例: 给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回它的最大深度3 思路: 很好理解 如果一棵二叉树,左子树深度为LD,右子树深度为...原创 2020-04-18 09:36:15 · 173 阅读 · 0 评论 -
Leetcode 101. 对称二叉树(简单)递归 和 迭代
题目描述: 给定一个二叉树,检查它是否是镜像对称的。 例如,二叉树[1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个[1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 \ \ 3 3 进阶: 你可以运用递归和迭代...原创 2020-04-16 12:07:22 · 320 阅读 · 1 评论 -
Leetcode 100.相同的树 (简单) 递归
题目描述: 给定两个二叉树,编写一个函数来检验它们是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 示例1: 输入: 1 1 / \ / \ 2 3 2 3 [1,2,3], [1,2,3] 输出: true 示例 2: 输入: 1...原创 2020-04-16 11:37:13 · 179 阅读 · 0 评论 -
Leetcode 239. 滑动窗口最大值(困难)
题目描述: 给定一个数组 nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 进阶: 你能在线性时间复杂度内解决此题吗? 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5,6,7] 解释: ...原创 2020-04-14 23:29:32 · 440 阅读 · 0 评论 -
Leetcode 503. 下一个更大元素 II
题目描述: 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。 示例 1: 输入: [1,2,1] 输出: [2,-1,2] 解释: 第一个 1 的下一个更大的数是 2; 数字 2 找不到下一个更大...原创 2020-04-14 09:53:15 · 298 阅读 · 0 评论 -
Leetcode 144. 二叉树的前序遍历(中等) 递归法和非递归法
题目描述: 给定一个二叉树,返回它的前序遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 进阶:递归算法很简单,你可以通过迭代算法完成吗? 思路:常规的递归和非递归,看代码即可。 递归法 /** * Definition for a binary tree node. * struct...原创 2020-04-11 18:04:31 · 230 阅读 · 0 评论 -
Leetcode 102. 二叉树的层序遍历(中等) 层次遍历
题目描述: 给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。 示例: 二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其层次遍历结果: [ [3], [9,20], [15,7] ] 思路: 常规的层次遍历思路,建立一个队列(内存优化可以...原创 2020-04-10 22:44:20 · 227 阅读 · 0 评论 -
Leetcode 94. 二叉树的中序遍历(中等)递归与非递归(迭代)
题目描述: 给定一个二叉树,返回它的中序遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶:递归算法很简单,你可以通过迭代算法完成吗? 思路: 1、常规的中序递归法 void traverse(TreeNode* root) { if(root != NULL) {...原创 2020-04-10 21:06:47 · 266 阅读 · 0 评论 -
Leetcode 437. 路径总和III (简单) 递归思想
题目描述: 给定一个二叉树,它的每个结点都存放着一个整数值。 找出路径和等于给定数值的路径总数。 路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。 二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。 示例: root = [10,5,-3,3,2,null,11,3,-2,null,1], su...原创 2020-04-10 18:09:44 · 194 阅读 · 0 评论 -
Leetcode 72. 编辑距离(困难) 动态规划
题目描述: 给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 示例 1: 输入:word1 = "horse", word2 = "ros" 输出:3 解释: horse -> rorse (将 'h' 替换为 'r')...原创 2020-04-09 10:12:17 · 228 阅读 · 0 评论 -
Leetcode 1405. 最长快乐字符串(中等) 贪心
题目描述: 如果字符串中不含有任何 'aaa','bbb' 或 'ccc' 这样的字符串作为子串,那么该字符串就是一个「快乐字符串」。 给你三个整数 a,b ,c,请你返回 任意一个 满足下列全部条件的字符串 s: s 是一个尽可能长的快乐字符串。 s 中 最多 有a 个字母 'a'、b 个字母 'b'、c 个字母 'c' 。 s 中只含有 'a'、'b' 、'c' ...原创 2020-04-08 23:46:52 · 298 阅读 · 0 评论 -
Leetcode 1143. 最长公共子序列(中等) 动态规划
题目描述: 给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。 例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。 ...原创 2020-04-08 17:39:25 · 306 阅读 · 0 评论 -
leetcode 452. 用最少数量的箭引爆气球(中等)贪心算法
题目描述: 在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。由于它是水平的,所以y坐标并不重要,因此只要知道开始和结束的x坐标就足够了。开始坐标总是小于结束坐标。平面内最多存在104个气球。 一支弓箭可以沿着x轴从不同点完全垂直地射出。在坐标x处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ ...原创 2020-04-08 11:36:08 · 227 阅读 · 0 评论 -
Leetcode 435. 无重叠区间(中等)贪心思想
题目描述: 给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。 注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。 示例 1: 输入: [ [1,2], [2,3], [3,4], [1,3] ] 输出: 1 解释: 移除 [1,3] 后,剩下的区间没有重叠。 示例 2: 输入: ...原创 2020-04-08 11:12:26 · 323 阅读 · 0 评论 -
Leetcode 42. 接雨水问题(困难)
题目描述: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。 示例: 输入: [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6 来源:力扣(Leet...原创 2020-04-05 23:27:43 · 269 阅读 · 0 评论 -
Leetcode 1011. 在D天内送达包裹的能力 (中等) 二分法求左边界
题目描述: 传送带上的包裹必须在 D 天内从一个港口运送到另一个港口。 传送带上的第 i 个包裹的重量为 weights[i]。每一天,我们都会按给出重量的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。 返回能在 D 天内将传送带上的所有包裹送达的船的最低运载能力。 示例 1: 输入:weights = [1,2,3,4,5,6,7,8,9,10], D = 5 ...原创 2020-04-05 12:42:41 · 237 阅读 · 0 评论 -
Leetcode 875. 爱吃香蕉的珂珂(中等) 二分法求左边界
题目描述: 珂珂喜欢吃香蕉。这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 H 小时后回来。 珂珂可以决定她吃香蕉的速度 K (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 K 根。如果这堆香蕉少于 K 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。 珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。 返回她可以在 H ...原创 2020-04-05 11:14:42 · 693 阅读 · 0 评论 -
Leetcode 3. 无重复字符的最长子串(中等)双指针(滑动窗口)
题目描述: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2: 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 示例 3: 输入: "pwwkew" 输出: 3 解释: 因为无重复字符的...原创 2020-04-03 17:48:15 · 281 阅读 · 0 评论 -
Leetcode 438. 找到字符串中所有字母异位词 (中等)双指针(滑动窗口)
题目描述: 给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。 字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。 说明: 字母异位词指字母相同,但排列不同的字符串。 不考虑答案输出的顺序。 示例 1: 输入: s: "cbaebabacd" p: "abc" 输出: [0, 6]...原创 2020-04-03 15:32:20 · 288 阅读 · 0 评论 -
Leetcode 76. 最小覆盖子串(困难)双指针中的滑动窗口技巧
题目描述: 给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。 示例: 输入: S = "ADOBECODEBANC", T = "ABC" 输出: "BANC" 说明: 如果 S 中不存这样的子串,则返回空字符串 ""。 如果 S 中存在这样的子串,我们保证它是唯一的答案。 来源:力扣(LeetCode) 思路: 使用双指...原创 2020-04-02 23:47:50 · 342 阅读 · 0 评论 -
Leetcode 416. 分割等和子集 (中等) 动态规划 01 背包的变体
题目描述: 给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200 示例 1: 输入: [1, 5, 11, 5] 输出: true 解释: 数组可以分割成 [1, 5, 5] 和 [11]. 示例 2: 输入: [1, 2, 3, 5] 输出: f...原创 2020-03-31 23:51:39 · 537 阅读 · 0 评论 -
Leetcode 518. 零钱兑换 II(中等) 动态规划
题目描述: 给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。 示例 1: 输入: amount = 5, coins = [1, 2, 5] 输出: 4 解释: 有四种方式可以凑成总金额: 5=5 5=2+2+1 5=2+1+1+1 5=1+1+1+1+1 示例 2: 输入: amount = 3, coins = [2] 输出: ...原创 2020-03-26 23:33:14 · 274 阅读 · 0 评论 -
Leetcode 70. 爬楼梯 (简单) 动态规划
题目描述: 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数。 示例 1: 输入: 2 输出: 2 解释: 有两种方法可以爬到楼顶。 1. 1 阶 + 1 阶 2. 2 阶 示例 2: 输入: 3 输出: 3 解释: 有三种方法可以爬到楼顶。 1. 1 阶 + 1 阶 + 1 阶...原创 2020-03-26 21:56:16 · 211 阅读 · 0 评论