LeetCode
张小猪的家
这个作者很懒,什么都没留下…
展开
-
[LeetCode]229. 求众数 II
229. 求众数 II难度:中等给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。**进阶:**尝试设计时间复杂度为 O(n)、空间复杂度为 O(1)的算法解决此问题。示例 1:输入:[3,2,3]输出:[3]示例 2:输入:nums = [1]输出:[1]示例 3:输入:[1,1,1,3,3,2,2,2]输出:[1,2]提示:1 <= nums.length <= 5 * 104-109 <= nums[i] <=原创 2021-09-01 19:59:39 · 69 阅读 · 0 评论 -
[LeetCode]227. 基本计算器 II
227. 基本计算器 II难度:中等给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分。示例 1:输入:s = "3+2*2"输出:7示例 2:输入:s = " 3/2 "输出:1示例 3:输入:s = " 3+5 / 2 "输出:5提示:1 <= s.length <= 3 * 105s 由整数和算符 ('+', '-', '*', '/') 组成,中间由一些空格隔开s 表示一个 有效表达式表达式中的所有整数都原创 2021-09-01 19:13:28 · 144 阅读 · 0 评论 -
[LeetCode]226. 翻转二叉树
226. 翻转二叉树难度简单翻转一棵二叉树。示例:输入: 4 / \ 2 7 / \ / \1 3 6 9输出: 4 / \ 7 2 / \ / \9 6 3 1# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):#原创 2021-09-01 16:59:23 · 66 阅读 · 0 评论 -
[LeetCode]221. 最大正方形
221. 最大正方形难度:中等在一个由 '0' 和 '1' 组成的二维矩阵内,找到只包含 '1' 的最大正方形,并返回其面积。示例 1:输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]输出:4示例 2:输入:matrix = [["0","1"],["1","0"]]输出:1示例 3:输入:matrix = [["0"]]输出原创 2021-09-01 16:46:31 · 79 阅读 · 0 评论 -
[LeetCode]220. 存在重复元素 III
220. 存在重复元素 III难度:中等给你一个整数数组 nums 和两个整数 k 和 t 。请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] - nums[j]) <= t ,同时又满足 abs(i - j) <= k 。如果存在则返回 true,不存在返回 false。示例 1:输入:nums = [1,2,3,1], k = 3, t = 0输出:true示例 2:输入:nums = [1,0,1,1], k = 1, t = 2输出:true原创 2021-09-01 16:04:38 · 88 阅读 · 0 评论 -
[LeetCode]219. 存在重复元素 II
219. 存在重复元素 II难度:简单给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k。示例 1:输入: nums = [1,2,3,1], k = 3输出: true示例 2:输入: nums = [1,0,1,1], k = 1输出: true示例 3:输入: nums = [1,2,3,1,2,3], k = 2输出: falseclass Solut原创 2021-09-01 15:04:32 · 47 阅读 · 0 评论 -
[LeetCode]215. 数组中的第K个最大元素
215. 数组中的第K个最大元素难度:中等给定整数数组 nums 和整数 k,请返回数组中第 **k** 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4提示:1 <= k <= nums.length <= 104-104 <= nums[i] <=原创 2021-09-01 14:48:05 · 89 阅读 · 0 评论 -
[LeetCode]212. 单词搜索 II
212. 单词搜索 II难度:困难给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words,找出所有同时在二维网格和字典中出现的单词。单词必须按照字母顺序,通过 相邻的单元格 内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。示例 1:输入:board = [["o","a","a","n"],["e","t","a","e"],["i","h","k","r"],["i","f","l","v"]],原创 2021-09-01 12:10:00 · 208 阅读 · 0 评论 -
[LeetCode]211. 添加与搜索单词 - 数据结构设计
211. 添加与搜索单词 - 数据结构设计难度:中等请你设计一个数据结构,支持 添加新单词 和 查找字符串是否与任何先前添加的字符串匹配 。实现词典类 WordDictionary :WordDictionary() 初始化词典对象void addWord(word) 将 word 添加到数据结构中,之后可以对它进行匹配bool search(word) 如果数据结构中存在字符串与 word 匹配,则返回 true ;否则,返回 false 。word 中可能包含一些 '.' ,每个 . 都可原创 2021-09-01 10:45:49 · 78 阅读 · 0 评论 -
[LeetCode]209. 长度最小的子数组
209. 长度最小的子数组难度:中等给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度**。**如果不存在符合条件的子数组,返回 0 。示例 1:输入:target = 7, nums = [2,3,1,2,4,3]输出:2解释:子数组 [4,3] 是该条件下的长度最小的子数组。示例 2:输入:target = 4, nu原创 2021-08-31 20:56:18 · 55 阅读 · 0 评论 -
[LeetCode]208. 实现 Trie (前缀树)
208. 实现 Trie (前缀树)难度:中等Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。请你实现 Trie 类:Trie() 初始化前缀树对象。void insert(String word) 向前缀树中插入字符串 word 。boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 fa原创 2021-08-31 20:12:28 · 124 阅读 · 0 评论 -
[LeetCode]206. 反转链表
206. 反转链表难度:简单给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例 1:输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]示例 2:输入:head = [1,2]输出:[2,1]示例 3:输入:head = []输出:[]提示:链表中节点的数目范围是 [0, 5000]-5000 <= Node.val <= 5000**进阶:**链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?#原创 2021-08-31 19:11:00 · 63 阅读 · 0 评论 -
[LeetCode]203. 移除链表元素
203. 移除链表元素难度:简单给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。示例 1:输入:head = [1,2,6,3,4,5,6], val = 6输出:[1,2,3,4,5]示例 2:输入:head = [], val = 1输出:[]示例 3:输入:head = [7,7,7,7], val = 7输出:[]提示:列表中的节点数目在范围 [0, 104] 内1 &l原创 2021-08-31 17:23:46 · 51 阅读 · 0 评论 -
[LeetCode]461. 汉明距离
461. 汉明距离难度:简单两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。给你两个整数 x 和 y,计算并返回它们之间的汉明距离。示例 1:输入:x = 1, y = 4输出:2解释:1 (0 0 0 1)4 (0 1 0 0) ↑ ↑上面的箭头指出了对应二进制位不同的位置。示例 2:输入:x = 3, y = 1输出:1提示:0 <= x, y <= 231 - 1解法一:class Solutio原创 2021-08-31 17:06:40 · 46 阅读 · 0 评论 -
[LeetCode]201. 数字范围按位与
201. 数字范围按位与难度:中等给你两个整数 left 和 right ,表示区间 [left, right] ,返回此区间内所有数字 按位与 的结果(包含 left 、right 端点)。示例 1:输入:left = 5, right = 7输出:4示例 2:输入:left = 0, right = 0输出:0示例 3:输入:left = 1, right = 2147483647输出:0提示:0 <= left <= right <= 231 - 1原创 2021-08-31 17:04:46 · 55 阅读 · 0 评论 -
[LeetCode]200. 岛屿数量
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:输入原创 2021-08-31 15:46:26 · 221 阅读 · 0 评论 -
[LeetCode]199. 二叉树的右视图
199. 二叉树的右视图难度:中等给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例 1:输入: [1,2,3,null,5,null,4]输出: [1,3,4]示例 2:输入: [1,null,3]输出: [1,3]示例 3:输入: []输出: []提示:二叉树的节点个数的范围是 [0,100]-100 <= Node.val <= 100解法一:层序遍历取每层最后一个# Defini原创 2021-08-31 15:25:51 · 48 阅读 · 0 评论 -
[LeetCode]198. 打家劫舍
198. 打家劫舍难度:中等你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4原创 2021-08-29 17:15:22 · 60 阅读 · 0 评论 -
[LeetCode]191. 位1的个数
191. 位1的个数难度:简单编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。提示:请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 3 中,输入表示有符号整数 -3。示例 1:输入:原创 2021-08-29 16:51:03 · 86 阅读 · 0 评论 -
[LeetCode]160. 相交链表
160. 相交链表难度:简单给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。图示两个链表在节点 c1 开始相交**:**题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原始结构 。示例 1:输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3输出:Inter原创 2021-08-29 16:29:42 · 224 阅读 · 0 评论 -
[LeetCode]190. 颠倒二进制位
190. 颠倒二进制位难度:简单颠倒给定的 32 位无符号整数的二进制位。提示:请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 2 中,输入表示有符号整数 -3,输出表示有符号整数 -1073741825。进阶:如果多次调用这个函数,你将如何优化你的算法?原创 2021-08-29 11:30:29 · 88 阅读 · 0 评论 -
Python位运算符
Python位运算符按位运算符是把数字看作二进制来进行计算的。Python中的按位运算法则如下:下表中变量 a 为 60,b 为 13,二进制格式如下:a = 0011 1100b = 0000 1101-----------------a&b = 0000 1100a|b = 0011 1101a^b = 0011 0001~a = 1100 0011运算符描述实例&按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结原创 2021-08-29 11:29:14 · 465 阅读 · 0 评论 -
[LeetCode]172. 阶乘后的零
172. 阶乘后的零难度:简单给定一个整数 n,返回 n! 结果尾数中零的数量。示例 1:输入: 3输出: 0解释: 3! = 6, 尾数中没有零。示例 2:输入: 5输出: 1解释: 5! = 120, 尾数中有 1 个零.说明: 你算法的时间复杂度应为 O(log n) 。class Solution: def trailingZeroes(self, n: int) -> int: cnt = 0 while n >=原创 2021-08-28 21:23:48 · 75 阅读 · 0 评论 -
[LeetCode]169. 多数元素
169. 多数元素难度简单1108收藏分享切换为英文接收动态反馈给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入:[3,2,3]输出:3示例 2:输入:[2,2,1,1,1,2,2]输出:2进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。解法一:哈希(空间复杂度O(n))class Solution: d原创 2021-08-28 20:46:59 · 56 阅读 · 0 评论 -
[LeetCode]167. 两数之和 II - 输入有序数组
167. 两数之和 II - 输入有序数组难度:简单给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。函数应该以长度为 2 的整数数组的形式返回这两个数的下标值*。*numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。示例 1:输入:num原创 2021-08-28 18:25:18 · 64 阅读 · 0 评论 -
[LeetCode]155. 最小栈
155. 最小栈难度:简单设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。示例:输入:["MinStack","push","push","push","getMin","pop","top","getMin"][[],[-2],[0],[-3],[],[],[],[]]输出:[null,原创 2021-08-28 17:52:59 · 107 阅读 · 0 评论 -
[LeetCode]154. 寻找旋转排序数组中的最小值 II
154. 寻找旋转排序数组中的最小值 II难度:困难已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,4,4,5,6,7] 在变化后可能得到:若旋转 4 次,则可以得到 [4,5,6,7,0,1,4]若旋转 7 次,则可以得到 [0,1,4,4,5,6,7]注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ...原创 2021-08-28 17:14:43 · 80 阅读 · 0 评论 -
[LeetCode]153. 寻找旋转排序数组中的最小值
153. 寻找旋转排序数组中的最小值难度:中等已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]若旋转 7 次,则可以得到 [0,1,2,4,5,6,7]注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a原创 2021-08-28 16:11:27 · 229 阅读 · 0 评论 -
[LeetCode]152. 乘积最大子数组
152. 乘积最大子数组难度:中等给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。示例 1:输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6。示例 2:输入: [-2,0,-1]输出: 0解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。class Solution: def maxProduct(self, nums: List[int]) ->原创 2021-08-28 15:34:46 · 75 阅读 · 0 评论 -
[LeetCode]150. 逆波兰表达式求值
150. 逆波兰表达式求值难度:中等根据 逆波兰表示法,求表达式的值。有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明:整数除法只保留整数部分。给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。示例 1:输入:tokens = ["2","1","+","3","*"]输出:9解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9示例 2:输入:tokens = ["4","1原创 2021-08-28 14:36:51 · 678 阅读 · 0 评论 -
[LeetCode]147. 对链表进行插入排序
147. 对链表进行插入排序难度:中等对链表进行插入排序。插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。插入排序算法:插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。重复直到所有输入数据插入完为止。示例 1:输入: 4->2-&g原创 2021-08-28 14:01:44 · 62 阅读 · 0 评论 -
[LeetCode]146. LRU 缓存机制
146. LRU 缓存机制难度:中等运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。实现 LRUCache 类:LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达原创 2021-08-27 22:32:18 · 188 阅读 · 0 评论 -
[LeetCode]145. 二叉树的后序遍历
145. 二叉树的后序遍历难度:简单给定一个二叉树,返回它的 后序 遍历。示例:输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1]进阶: 递归算法很简单,你可以通过迭代算法完成吗?# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# s原创 2021-08-27 18:43:42 · 45 阅读 · 0 评论 -
[LeetCode]144. 二叉树的前序遍历
144. 二叉树的前序遍历难度:简单给你二叉树的根节点 root ,返回它节点值的 前序 遍历。示例 1:输入:root = [1,null,2,3]输出:[1,2,3]示例 2:输入:root = []输出:[]示例 3:输入:root = [1]输出:[1]示例 4:输入:root = [1,2]输出:[1,2]示例 5:输入:root = [1,null,2]输出:[1,2]提示:树中节点数目在范围 [0, 100] 内-100 <= N原创 2021-08-27 18:41:31 · 55 阅读 · 0 评论 -
[LeetCode]140. 单词拆分 II
140. 单词拆分 II难度:困难给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。说明:分隔时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。示例 1:输入:s = "catsanddog"wordDict = ["cat", "cats", "and", "sand", "dog"]输出:[ "cats and dog", "cat sand dog原创 2021-08-27 14:42:19 · 58 阅读 · 0 评论 -
[LeetCode]139. 单词拆分
139. 单词拆分难度:中等给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。示例 1:输入: s = "leetcode", wordDict = ["leet", "code"]输出: true解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。示例 2:输入: s = "applepenap原创 2021-08-26 22:50:16 · 55 阅读 · 0 评论 -
[LeetCode]136. 只出现一次的数字
136. 只出现一次的数字难度:简单给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,1]输出: 1示例 2:输入: [4,1,2,1,2]输出: 4解法一:模拟class Solution: def singleNumber(self, nums: List[int]) -> int: for i原创 2021-08-26 21:57:17 · 98 阅读 · 0 评论 -
[LeetCode]32. 最长有效括号
32. 最长有效括号难度:困难给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。示例 1:输入:s = "(()"输出:2解释:最长有效括号子串是 "()"示例 2:输入:s = ")()())"输出:4解释:最长有效括号子串是 "()()"示例 3:输入:s = ""输出:0提示:0 <= s.length <= 3 * 104s[i] 为 '(' 或 ')'class Solution: def原创 2021-08-21 21:13:15 · 64 阅读 · 0 评论 -
快速幂算法
递归快速幂快速幂是一个二分的思路。我们很自然地可以得到一个递归方程:计算a的n次方,如果n是偶数(不为0),那么就先计算a的n/2次方,然后平方;如果n是奇数,那么就先计算a的n-1次方,再乘上a;递归出口是a的0次方为1。递归快速幂的思路非常自然,代码也很简单(直接把递归方程翻译成代码即可):def qpow(a, n): if n == 0: return 1 elif n % 2 == 1: return qpow(a, n - 1) * a else:原创 2021-08-21 19:06:26 · 137 阅读 · 0 评论 -
[LeetCode]132. 分割回文串 II
132. 分割回文串 II难度:困难给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。返回符合要求的 最少分割次数 。示例 1:输入:s = "aab"输出:1解释:只需一次分割就可将 s 分割成 ["aa","b"] 这样两个回文子串。示例 2:输入:s = "a"输出:0示例 3:输入:s = "ab"输出:1提示:1 <= s.length <= 2000s 仅由小写英文字母组成回溯(超时)class Solution:原创 2021-08-12 18:25:28 · 98 阅读 · 0 评论