![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LeetCode
LeetCode刷题
嗷嗷嗷嗷_
在读研究生
JAVA 后端
GIS
展开
-
LeetCode 98 验证二叉搜索树(中等)
给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1:输入: 2 / \ 1 3输出: true示例 2:输入: 5 / \ 1 4 / \ 3 6输出: false解释: 输入为: [5,1,4,null,null,3,6]。 根节点的值为 5 ,但是其原创 2020-11-04 17:20:23 · 107 阅读 · 0 评论 -
LeetCode 96 不同的二叉搜索树(中等)
递归法LeetCode中超时。class Solution { public int numTrees(int n) { return numTreesCore(1,n); } public int numTreesCore(int start, int end){ if (start >= end) return 1; int sum = 0; for (int i = start; i <= end原创 2020-11-03 22:08:42 · 84 阅读 · 0 评论 -
LeetCode 94 二叉树的中序遍历(中等)
给定一个二叉树,返回它的中序 遍历。思路与代码迭代遍历二叉树的前、中、后序遍历(迭代法)class Solution { public List<Integer> inorderTraversal(TreeNode root) { List<Integer> res = new ArrayList(); Deque<TreeNode> stack = new ArrayDeque(); while (root原创 2020-11-02 14:35:32 · 69 阅读 · 0 评论 -
*LeetCode 85 最大矩形(困难)
给定一个仅包含 0 和 1 、大小为 rows x cols的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。输入:matrix = [["1","0","1","0","0"], ["1","0","1","1","1"], ["1","1","1","1","1"], ["1","0","0","1","0"]]输出:6解释:最大矩形如上图所示。思路与代码暴力解法通过遍历所有的(x1, y原创 2020-11-02 11:37:26 · 146 阅读 · 0 评论 -
*LeetCode 84 柱状图中最大的矩形(困难)
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 1[2,1,5,6,2,3]。图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。示例:输入: [2,1,5,6,2,3]输出: 10思路与代码暴力破解法暴力法应该比较容易想到,以每一个矩形为中心,向左向右搜索能到达的最远边界,计算以当前矩形高度的最大矩形面积。(中心扩展法)单原创 2020-11-01 13:56:07 · 200 阅读 · 0 评论 -
LeetCode 79 单词搜索(中等)
给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。示例:board =[ ['A','B','C','E'], ['S','F','C','S'], ['A','D','E','E']]给定 word = "ABCCED", 返回 true给定 word = "SEE", 返回 true给定 word = "ABCB", 返回 fa原创 2020-10-30 14:48:05 · 74 阅读 · 0 评论 -
LeetCode 78 子集(中等)
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。示例:思路与代码标准回溯递归输入: nums = [1,2,3]输出:[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], []]class Solution { private List<List<Integer>> res = new ArrayList(); priv原创 2020-10-30 10:50:48 · 82 阅读 · 0 评论 -
LeetCode 76 最小覆盖字符串(困难)
给你一个字符串 S、一个字符串 T 。请你设计一种算法,可以在 O(n) 的时间复杂度内,从字符串 S 里面找出:包含 T 所有字符的最小子串。示例:输入:S = “ADOBECODEBANC”, T = “ABC”输出:“BANC”思路与代码class Solution { public String minWindow(String s, String t) { int[] need = new int[128]; // need来记录窗口中各字符原创 2020-10-27 17:17:55 · 182 阅读 · 0 评论 -
LeetCode 75 颜色分类(中等)
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。注意:不能使用代码库中的排序函数来解决这道题。示例:输入: [2,0,2,1,1,0]输出: [0,0,1,1,2,2]进阶:一个直观的解决方案是使用计数排序的两趟扫描算法。首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。你能想出一个仅使用常数空间的一趟原创 2020-10-26 17:22:51 · 123 阅读 · 0 评论 -
LeetCode 70 爬楼梯(简单)
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1 阶 + 1 阶2 阶示例 2:输入: 3输出: 3解释: 有三种方法可以爬到楼顶。1 阶 + 1 阶 + 1 阶1 阶 + 2 阶2 阶 + 1 阶思路与代码递归很容易想到,递归过深则超出时间class Solution { public int原创 2020-10-23 16:41:10 · 91 阅读 · 0 评论 -
LeetCode 64 最小路径和(中等)
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例:输入:[ [1,3,1], [1,5,1], [4,2,1]]输出: 7解释: 因为路径 1→3→1→1→1 的总和最小。动态规划时间复杂度 O(mn)空间复杂度 O(mn)class Solution { public int minPathSum(int[][] grid) { int row = g原创 2020-10-23 10:15:09 · 71 阅读 · 0 评论 -
LeetCode 62 不同路径(中等)
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?例如,上图是一个7 x 3 的网格。有多少可能的路径?示例 1:输入: m = 3, n = 2输出: 3解释:从左上角开始,总共有 3 条路径可以到达右下角。向右 -> 向右 -> 向下向右 -> 向下 -> 向右向下 -> 向右 -&g原创 2020-10-22 22:31:35 · 77 阅读 · 0 评论 -
LeetCode 56 合并区间(中等)
给出一个区间的集合,请合并所有重叠的区间。示例 1:输入: intervals = [[1,3],[2,6],[8,10],[15,18]]输出: [[1,6],[8,10],[15,18]]解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].示例 2:输入: intervals = [[1,4],[4,5]]输出: [[1,5]]解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。思路与代码排序+顺序合并1 首先根据二维数组的第一位从小到大进行原创 2020-10-22 17:30:03 · 80 阅读 · 0 评论 -
LeetCode 55 跳跃游戏(中等)
给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。示例 1:输入: [2,3,1,1,4]输出: true解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。示例 2:输入: [3,2,1,0,4]输出: false解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。思路与代码动原创 2020-10-21 18:54:55 · 64 阅读 · 0 评论 -
LeetCode 53 最大子序和(简单)
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。思路与代码动态规划dp[i] 表示以第i个结尾的最大序列和(至少包含nums[i],因为子序列比必定至少包含一个数)动态转移:如果dp[i-1] <= 0 则dp[i]原创 2020-10-21 18:54:15 · 95 阅读 · 0 评论 -
LeetCode 49 字母异位词分组(中等)
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。示例:输入: ["eat", "tea", "tan", "ate", "nat", "bat"]输出:[ ["ate","eat","tea"], ["nat","tan"], ["bat"]]思路与代码对每个字符串重排序,维护一个Map即可。时间复杂度 O(nklog(k)) n是strs数组的长度 klog(k)是每个字符串排序的复杂度class Solution {原创 2020-10-20 18:21:11 · 90 阅读 · 0 评论 -
LeetCode 48 旋转图像(中等)
给定一个 n × n 的二维矩阵表示一个图像。将图像顺时针旋转 90 度。说明:你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。示例 1:给定 matrix = [ [1,2,3], [4,5,6], [7,8,9]],原地旋转输入矩阵,使其变为:[ [7,4,1], [8,5,2], [9,6,3]]示例 2:给定 matrix =[ [ 5, 1, 9,11], [ 2, 4, 8,10], [原创 2020-10-20 10:19:22 · 106 阅读 · 0 评论 -
LeetCode 46 全排列(中等)
给定一个 没有重复 数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]思路加代码标准回溯法最好别用Set代替visited数组,应为遍历Set时不能修改Set,会产生java.util.ConcurrentModificationException异常class Solution { public List<List<原创 2020-10-19 10:35:08 · 67 阅读 · 0 评论 -
LeetCode 42 接雨水(困难)
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例:输入: [0,1,0,2,1,0,1,3,2,1,2,1]输出: 6思路与代码双指针法1 用左右的双指针比较哪边柱子更矮,因为接水问题是看短板有多短2 从短板那边继续遍历,累计水量,直到遇到比短板长的板,再重新比较左右两个柱子。时间复杂度 O(n)空间复杂度 O(1)class Solution { public int trap(int[] height) {原创 2020-10-19 10:07:43 · 78 阅读 · 0 评论 -
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-18 20:13:32 · 75 阅读 · 0 评论 -
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]思路与代码class Solution { public原创 2020-10-18 19:46:59 · 108 阅读 · 0 评论 -
LeetCode 32 最长有效括号(困难)
基于栈85.。。。。。。。。。。。。。。。。。。。。。。。。。。。。class Solution { public int longestValidParentheses(String s) { int maxLen = 0; Deque<Integer> deque = new LinkedList(); deque.push(-1); for (int i = 0; i < s.length(); i++){原创 2020-10-18 19:44:10 · 110 阅读 · 1 评论 -
LeetCode 33 搜索旋转排序数组(中等)
给你一个升序排列的整数数组 nums ,和一个整数 target。假设按照升序排序的数组在预先未知的某个点上进行了旋转。(例如,数组 [0,1,2,4,5,6,7]可能变为[4,5,6,7,0,1,2])。请你在数组中搜索 target ,如果数组中存在这个目标值,则返回它的索引,否则返回 -1。示例 1:输入:nums = [4,5,6,7,0,1,2], target = 0输出:4示例 2:输入:nums = [4,5,6,7,0,1,2], target = 3输出:-1示原创 2020-10-17 10:43:16 · 80 阅读 · 0 评论 -
LeetCode 31 下一个排列(中等)
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须原地修改,只允许使用额外常数空间。以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1思路与代码1 从右往左遍历,找到第一个破坏降序的数字5。2 从5往右遍历,找到比5大中最小的数字6,交换5和6的位置。3 对交换后6右边的序列逆序即可。(若第一步原创 2020-10-15 10:39:38 · 68 阅读 · 0 评论 -
LeetCode 22 括号生成(中等)
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例:输入:n = 3输出:[ "((()))", "(()())", "(())()", "()(())", "()()()" ]思路与代码回溯算法时间复杂度 O(2^2n)空间复杂度 O(n) 最长递归栈2n 所以复杂度为O(n)class Solution { List<String> res原创 2020-10-14 14:57:30 · 108 阅读 · 0 评论 -
LeetCode 23 合并K个升序链表(困难)
给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。示例 1:输入:lists = [[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下:[ 1->4->5, 1->3->4, 2->6]将它们合并到一个有序链表中得到。1->1->2->3->4->4->5->6示例 2:输入:lists = []原创 2020-10-14 11:14:00 · 257 阅读 · 0 评论 -
LeetCode 21 合并两个有序链表(简单)
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4思路与代码使用哨兵节点,迭代合并两个链表。class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode sentine = new L原创 2020-10-13 10:39:20 · 70 阅读 · 0 评论 -
LeetCode 20 有效的括号(简单)
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: “()”输出: true示例 2:输入: “()[]{}”输出: true示例 3:输入: “([)]”输出: false思路与代码辅助栈法时间复杂度:O(n)空间复杂度:O(n)class Solution { public原创 2020-10-13 10:05:37 · 63 阅读 · 0 评论 -
LeetCode 19 删除链表的倒数第N个节点(中等)
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.说明:给定的 n 保证是有效的。进阶:你能尝试使用一趟扫描实现吗?思路加代码双指针使用哨兵节点(sentinel)class Solution { public ListNode removeNthFromEnd(ListNode head,原创 2020-10-12 11:34:06 · 60 阅读 · 0 评论 -
LeetCode 17 电话号码的字母组合(中等)
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。加粗样式示例:输入:“23”输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].思路与代码回溯class Solution { Map<Character, String> map = new HashMap(); List<String> res原创 2020-10-12 10:36:28 · 221 阅读 · 0 评论 -
LeetCode 15 三数之和(中等)
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。示例:给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:[ [-1, 0, 1], [-1, -1, 2]]思路和代码排序 + 双指针时间复杂度:O(n²),其中 n 是数组nums 的长度。空间复杂度:O(1)class Soluti原创 2020-10-11 16:36:25 · 64 阅读 · 0 评论 -
原创 LeetCode 11 盛最多水的容器(中等)
给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器,且 n 的值至少为 2。图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。示例:输入:[1,8,6,2,5,4,8,3,7]输出:49思路与代码双指原创 2020-10-11 15:26:20 · 71 阅读 · 0 评论 -
LeetCode 10 正则表达式匹配(困难)
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.'和 '*'的正则表达式匹配。'.' 匹配任意单个字符'*' 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。说明:s可能为空,且只包含从 a-z 的小写字母。p可能为空,且只包含从 a-z 的小写字母,以及字符. 和 *。示例 1:输入:s = “aa”p = “a”输出: false解释: “a” 无法匹配 “aa” 整个字符串。示例 2:输入:s = “aa”原创 2020-10-11 14:59:25 · 87 阅读 · 0 评论 -
LeetCode 5 最长回文子串(中等)
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: “babad”输出: “bab”注意: “aba” 也是一个有效答案。示例 2:输入: “cbbd”输出: “bb”思路和代码动态规划时间复杂度 O(n²) 空间复杂度O(n²)动态转移方程 dp[i][j] = dp[i+1][j-1] && s.charAt(i) == s.charAt(j)class Solution { private原创 2020-10-09 10:51:31 · 51 阅读 · 0 评论 -
LeetCode 4 寻找两个正序数组的中位数(困难)
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?示例 1:输入:nums1 = [1,3], nums2 = [2]输出:2.00000解释:合并数组 = [1,2,3] ,中位数 2示例 2:输入:nums1 = [1,2], nums2 = [3,4]输出:2.50000解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3)原创 2020-10-07 14:53:45 · 85 阅读 · 0 评论 -
LeetCode 3 无重复字符的最长子串(中等)
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串思路与原创 2020-10-07 10:29:40 · 177 阅读 · 0 评论 -
LeetCode 2 两数相加(中等)
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807思路 + 代码时间复杂度 O(max(m,n)) 空间复杂度 O(原创 2020-10-06 10:42:20 · 98 阅读 · 0 评论 -
LeetCode 1 两数之和(简单)
给定一个整数数组 nums和一个目标值target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]思路 + 代码哈希表 时间复杂度O(n) 空间复杂度O(n)class Solution { public int[]原创 2020-10-06 10:19:17 · 95 阅读 · 0 评论 -
LeetCode 117 填充每个节点的下一个右侧节点指针 II(中等)
给定一个二叉树struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有next 指针都被设置为 NULL。进阶:你只能使用常量级额外空间。 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。示例:输入:root = [1,.原创 2020-09-28 10:10:24 · 143 阅读 · 0 评论 -
LeetCode 235 二叉搜索树的最近公共祖先(简单)
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树:root =[6,2,8,0,4,7,9,null,null,3,5]示例 1:输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8输出: 6解释: 节...原创 2020-09-27 10:19:13 · 93 阅读 · 0 评论