Leetcode
算法刷题
AI_Younger_Man
这个作者很懒,什么都没留下…
展开
-
leetcode_读书笔记_栈和深度优先搜索
深度优先搜索:从根节点A开始,每次从其中的一个邻居节点开始遍历,然后从邻居节点的邻居乡下遍历,直到找到目标,或者,当前节点不是目标,并且他没有邻居节点,那就出栈。然后从栈顶元素再找一个元素出栈,判断是不是目标,不是目标,判断一下时候有邻居,有邻居吧,入栈,并且其中一个邻居入栈,然后并且标记这个结点已经访问过了。深度优先遍历:递归调用的形式:/* * Return true if there is a path from cur to target. */boolean DFS(Node cu.原创 2020-12-09 14:25:50 · 225 阅读 · 0 评论 -
leetcode-150.-逆波兰表达式求值
逆波兰表达式求值根据 逆波兰表示法,求表达式的值。有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明:整数除法只保留整数部分。给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。示例 1:输入: [“2”, “1”, “+”, “3”, “*”]输出: 9解释: 该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9示例 2:输入: [“4”, “13”, “5”, “/”, “+”.原创 2020-12-08 10:31:32 · 184 阅读 · 0 评论 -
leetcode-739-每日温度
每日温度请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。思路:维护一个单调递减栈,保存的是.原创 2020-12-08 10:13:36 · 234 阅读 · 0 评论 -
leetcode-20-有效括号
有效的括号给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: “()”输出: true示例 2:输入: “()[]{}”输出: true示例 3:输入: “(]”输出: false示例 4:输入: “([)]”输出: false示例 5:输入: “{[]}”输出: true思路:就很简单,左.原创 2020-12-07 21:29:41 · 73 阅读 · 0 评论 -
leetcode-155-最小栈
最小栈设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。示例:输入:[“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”][[],[-2],[0],[-3],[],[],[],[]]输出:[null,null,null,nu.原创 2020-12-07 21:05:12 · 132 阅读 · 0 评论 -
leetcode-读书笔记-栈:后入先出的数据结构
实现 - 栈栈的实现比队列容易。动态数组足以实现堆栈结构。这里我们提供了一个简单的实现供你参考:// "static void main" must be defined in a public class.class MyStack { private List<Integer> data; // store elements public MyStack() { data = new ArrayList<>(...原创 2020-12-07 20:03:56 · 157 阅读 · 0 评论 -
leetcode-5-最长回文子串-三种解法
最长回文子串给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: “babad”输出: “bab”注意: “aba” 也是一个有效答案。示例 2:输入: “cbbd”输出: “bb”、第一:暴力解法:看代码注释很容易理解时间复杂度:因为主程序有2个for循环,掉用的函数还有一次n循环,总的时间复杂度是N的3方class Solution { /** * 暴力解法:这个函数是判断当前传进来的子串是不是回文子串,就是.原创 2020-12-07 10:13:13 · 166 阅读 · 0 评论 -
leetcode-279-完全平方数
完全平方数给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。示例 1:输入: n = 12输出: 3解释: 12 = 4 + 4 + 4.示例 2:输入: n = 13输出: 2解释: 13 = 4 + 9.思路:使用BFS,首先找到小于n的所有开平方数字,然后判断当前n减去这些开平方数是否有开平方数,比如12减去1,2,8,没有开平方数,那么当前level就要+1然后进入到下一层 11 8 .原创 2020-12-06 21:37:05 · 114 阅读 · 0 评论 -
leetcode-200-岛屿数量
岛屿数量给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例 1:输入:grid = [[“1”,“1”,“1”,“1”,“0”],[“1”,“1”,“0”,“1”,“0”],[“1”,“1”,“0”,“0”,“0”],[“0”,“0”,“0”,“0”,“0”]]输出:1示例 2:输入:grid = [[“1”,“1”.原创 2020-12-05 23:28:55 · 94 阅读 · 0 评论 -
LeetCode 1262.可被三整除的最大和
给你一个整数数组 nums,请你找出并返回能被三整除的元素最大和。示例 1:输入:nums = [3,6,5,1,8]输出:18解释:选出数字 3, 6, 1 和 8,它们的和是 18(可被 3 整除的最大和)。示例 2:输入:nums = [4]输出:0解释:4 不能被 3 整除,所以无法选出数字,返回 0。示例 3:输入:nums = [1,2,3,4,4]输出:12解释:选出数字 1, 3, 4 以及 4,它们的和是 12(可被 3 整除的最大和)。提示:1 <= n原创 2020-12-05 18:22:49 · 341 阅读 · 2 评论 -
leetcode_读书笔记_队列和栈:队列先入先出的数据结构
循环队列的话,就要判断一下当前下表和数组长度取一下模自己设计一个循环队列:class MyCircularQueue { private int[] data; private int head; private int tail; private int size; /** Initialize your data structure here. Set the size of the queue to be k. */ publi...原创 2020-12-04 11:24:36 · 81 阅读 · 0 评论 -
leetcode-236-二叉树最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]示例 1:输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出: 3解释: 节点 5 和节点 1原创 2020-12-03 20:06:13 · 69 阅读 · 0 评论 -
leetcode_638_超市大礼包购买
大礼包在LeetCode商店中, 有许多在售的物品。然而,也有一些大礼包,每个大礼包以优惠的价格捆绑销售一组物品。现给定每个物品的价格,每个大礼包包含物品的清单,以及待购物品清单。请输出确切完成待购清单的最低花费。每个大礼包的由一个数组中的一组数据描述,最后一个数字代表大礼包的价格,其他数字分别表示内含的其他种类物品的数量。任意大礼包可无限次购买。示例 1:输入: [2,5], [[3,0,5],[1,2,10]], [3,2]输出: 14解释:有A和B两种物品,价格分别为¥2和¥5.原创 2020-12-03 09:01:19 · 265 阅读 · 0 评论 -
leetcode417_大西洋太平洋水流问题
给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度。“太平洋”处于大陆的左边界和上边界,而“大西洋”处于大陆的右边界和下边界。规定水流只能按照上、下、左、右四个方向流动,且只能从高到低或者在同等高度上流动。请找出那些水流既可以流动到“太平洋”,又能流动到“大西洋”的陆地单元的坐标。提示:输出坐标的顺序不重要m 和 n 都小于150示例:给定下面的 5x5 矩阵:太平洋 ~ ~ ~ ~ ~1 2 2 3 (5) *3 2 3 (4原创 2020-12-02 10:16:56 · 98 阅读 · 0 评论 -
leetcode-316-在字符串中去除重复字母保证字典序最小
给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。注意:该题与 1081 https://leetcode-cn.com/problems/smallest-subsequence-of-distinct-characters 相同示例 1:输入:s = “bcabc”输出:“abc”示例 2:输入:s = “cbacdcbc”输出:“acdb”提示:1 <= s.length <= 104原创 2020-12-02 08:30:34 · 2291 阅读 · 1 评论 -
leetcode-34. 在排序数组中查找元素的第一个和最后一个位置
在排序数组中查找元素的第一个和最后一个位置给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级别。如果数组中不存在目标值,返回 [-1, -1]。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: [3,4]示例 2:输入: nums = [5,7,7,8,8,10], target = 6输出: [-1,-1]Java:public.原创 2020-11-09 09:31:36 · 82 阅读 · 0 评论 -
leetcode-560. 和为K的子数组
和为K的子数组给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。示例 1 :输入:nums = [1,1,1], k = 2输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。说明 :数组的长度为 [1, 20,000]。数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。思路:前缀和 + HASHtableclass Solution { public int subarraySum.原创 2020-11-08 22:29:39 · 112 阅读 · 0 评论 -
leetcode-621. 任务调度器
任务调度器给定一个用字符数组表示的 CPU 需要执行的任务列表。其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。CPU 在任何一个单位时间内都可以执行一个任务,或者在待命状态。然而,两个相同种类的任务之间必须有长度为 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。你需要计算完成所有任务所需要的最短时间。示例 :输入:tasks = [“A”,“A”,“A”,“B.原创 2020-11-08 09:29:08 · 229 阅读 · 0 评论 -
leetcode-647. 回文子串
回文子串给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。示例 1:输入:“abc”输出:3解释:三个回文子串: “a”, “b”, “c”示例 2:输入:“aaa”输出:6解释:6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”class Solution: def __init__(self): self.res = 0 de.原创 2020-11-07 21:22:54 · 127 阅读 · 0 评论 -
5,10,20买包子
#!/usr/bin/pythonimport sys# line = sys.stdin.readline().strip()# # 把每一行的数字分隔后转化成int列表# nums = list(map(int, line.split()))nums = [5,5,5,5,10,10,20,5,5,10,10,5,20]moneys = []def aaa(moneys): for num in nums: if num == 5: mon原创 2020-11-07 20:38:41 · 247 阅读 · 0 评论 -
leetcode-739-每日温度
请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。构造一个单调栈,保存的元素师下标,当当前下标代表原创 2020-11-07 15:04:03 · 174 阅读 · 0 评论 -
leetcode-146. LRU缓存机制
运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。实现 LRUCache 类:LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久原创 2020-11-07 11:31:45 · 164 阅读 · 1 评论 -
leetcode- 39- 组合总和
组合总和给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。示例 1:输入:candidates = [2,3,6,7], target = 7,所求解集为:[[7],[2,2,3]]示例 2:输入:candidates = [2,3,5], target .原创 2020-10-08 15:28:46 · 72 阅读 · 0 评论 -
leetcode-37. 解数独
编写一个程序,通过填充空格来解决数独问题。一个数独的解法需遵循如下规则:数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。空白格用 ‘.’ 表示。提示:给定的数独序列只包含数字 1-9 和字符 ‘.’ 。你可以假设给定的数独只有唯一解。给定数独永远是 9x9 形式的。class Solution: def solveSudoku(self, board: List[List[str]]) -&原创 2020-10-07 20:15:07 · 113 阅读 · 0 评论 -
leetcode- 17. 电话号码的字母组合
电话号码的字母组合给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例:输入:“23”输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].说明:尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。思路:先前两个数字进行组合,然后第三个数字是前两个组合基础之上在进行组合然后一次类推class Solution(obje.原创 2020-10-01 10:07:50 · 188 阅读 · 0 评论 -
leetcode-543. 二叉树的直径
二叉树的直径给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。示例 :给定二叉树 1 / \ 2 3 / \ 4 5 返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。注意:两结点之间的路径长度是以它们之间边的数目表示。思路:和尚一道题目非常像:LP定义是:当前节点经过,并且至少经过他的一个字节点# Definitio.原创 2020-09-30 14:19:43 · 97 阅读 · 0 评论 -
leetcode-865. 具有所有最深结点的最小子树
具有所有最深结点的最小子树给定一个根为 root 的二叉树,每个结点的深度是它到根的最短距离。如果一个结点在整个树的任意结点之间具有最大的深度,则该结点是最深的。一个结点的子树是该结点加上它的所有后代的集合。返回能满足“以该结点为根的子树中包含所有最深的结点”这一条件的具有最大深度的结点。示例:输入:[3,5,1,6,2,0,8,null,null,7,4]输出:[2,7,4]解释:我们返回值为 2 的结点,在图中用黄色标记。在图中用蓝色标记的是树的最深的结点。输入 “[3, 5.原创 2020-09-30 08:59:58 · 159 阅读 · 0 评论 -
Leetcode 742.二叉树最近的叶子结点
题目描述给定一个 每个结点的值互不相同 的二叉树,和一个目标值 k,找出树中与目标值 k 最近的叶结点。这里,与叶结点 最近 表示在二叉树中到达该叶节点需要行进的边数与到达其它叶结点相比最少。而且,当一个结点没有孩子结点时称其为叶结点。在下面的例子中,输入的树以逐行的平铺形式表示。实际上的有根树 root 将以TreeNode对象的形式给出。示例 1:输入:root = [1, 3, 2], k = 1二叉树图示: 1 / \ 3 2123输出: 2原创 2020-09-30 08:23:19 · 484 阅读 · 0 评论 -
leetcode- 124. 二叉树中的最大路径和
二叉树中的最大路径和给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。示例 1:输入:[1,2,3] 1 / \ 2 3输出:6示例 2:输入:[-10,9,20,null,null,15,7]-10/ 9 20/ 15 7输出:42这道题目主要就是思路不懂就问:思路:输的题目,是否使用递归?从某一个节点出发,如果如果加上他的父.原创 2020-09-30 00:01:06 · 62 阅读 · 0 评论 -
leetcode - 98. 验证二叉搜索树
验证二叉搜索树给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1:输入:2/ 1 3输出: true示例 2:输入:5/ 1 4/ 3 6输出: false解释: 输入为: [5,1,4,null,null,3,6]。根节点的值为 5 ,但是其右子节点值为 4 。思想:树的问题一般都是递归,所.原创 2020-09-29 19:47:09 · 83 阅读 · 0 评论 -
leetcode - 671. 二叉树中第二小的节点
给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0。如果一个节点有两个子节点的话,那么该节点的值等于两个子节点中较小的一个。给出这样的一个二叉树,你需要输出所有节点中的第二小的值。如果第二小的值不存在的话,输出 -1 。示例 1:输入:2/ 2 5/ 5 7输出: 5说明: 最小的值是 2 ,第二小的值是 5 。示例 2:输入:2/ 2 2输出: -1说明: 最小的值是 2, 但是不存在第二小的值原创 2020-09-28 22:31:58 · 162 阅读 · 0 评论 -
leetcode-669. 修剪二叉搜索树
修剪二叉搜索树给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。示例 1:输入:1/ 0 2L = 1R = 2输出:12示例 2:输入:3/ 0 42/1L = 1R = 3输出:3/2/1二叉搜索树:只有三种情况,左边是小的,右边是大的# Definition for a b.原创 2020-09-28 21:29:34 · 113 阅读 · 0 评论 -
leetcode-655. 输出二叉树
输出二叉树在一个 m*n 的二维字符串数组中输出二叉树,并遵守以下规则:行数 m 应当等于给定二叉树的高度。列数 n 应当总是奇数。根节点的值(以字符串格式给出)应当放在可放置的第一行正中间。根节点所在的行与列会将剩余空间划分为两部分(左下部分和右下部分)。你应该将左子树输出在左下部分,右子树输出在右下部分。左下和右下部分应当有相同的大小。即使一个子树为空而另一个非空,你不需要为空的子树输出任何东西,但仍需要为另一个子树留出足够的空间。然而,如果两个子树都为空则不需要为它们留出任何空间。每个未.原创 2020-09-28 17:20:37 · 87 阅读 · 0 评论 -
leetcode- 617. 合并二叉树
合并二叉树给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。示例 1:输入:Tree 1 Tree 21 2/ \ / \3 2 .原创 2020-09-28 14:48:59 · 60 阅读 · 0 评论 -
leetcode-606. 根据二叉树创建字符串
根据二叉树创建字符串你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。空节点则用一对空括号 “()” 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。示例 1:输入: 二叉树: [1,2,3,4]1/ 2 3/4输出: “1(2(4))(3)”解释: 原本将是“1(2(4)())(3())”,在你省略所有不必要的空括号对之后,它将是“1(2(4))(3)”。示例 2:输入: 二叉树: [1,2,3,null.原创 2020-09-28 14:31:34 · 136 阅读 · 0 评论 -
leetcode 404-左叶子之和
左叶子之和计算给定二叉树的所有左叶子之和。示例:3/ 9 20/ 15 7在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass S.原创 2020-09-27 16:42:42 · 181 阅读 · 0 评论 -
leetcode-145. 二叉树的后序遍历
二叉树的后序遍历给定一个二叉树,返回它的 后序 遍历。示例:输入: [1,null,2,3]12/3输出: [3,2,1]进阶: 递归算法很简单,你可以通过迭代算法完成吗?# Definition for a binary tree node.from typing import Listclass TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val .原创 2020-09-27 16:21:42 · 130 阅读 · 0 评论 -
leetcode- 110. 平衡二叉树
平衡二叉树给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。示例 1:给定二叉树 [3,9,20,null,null,15,7]3/ 9 20/ 15 7返回 true 。示例 2:给定二叉树 [1,2,2,3,3,null,null,4,4] 1 / \ 2 2/ \3 3/ 4 4返回 false 。思路:所有节点的左子树和右子树高度之.原创 2020-09-27 15:05:31 · 69 阅读 · 0 评论 -
leetcode-102 二叉树的层序遍历
二叉树的层序遍历给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7],3/ 9 20/ 15 7返回其层次遍历结果:[[3],[9,20],[15,7]]# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x.原创 2020-09-27 14:31:44 · 94 阅读 · 0 评论 -
leetcode-21. 合并两个有序链表
合并两个有序链表将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4通过次数377,879提交次数586,685class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = .原创 2020-09-27 12:55:16 · 64 阅读 · 0 评论