LeetCode
文章平均质量分 95
LeetCode
u013250861
这个作者很懒,什么都没留下…
展开
-
LeetCode-题目详解(一):数组
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:示例 2:示例 3:提示:方法一:暴力枚举【O(N2)O(N^2)O(N2),其中 N 是数组中的元素数量】方法二:哈希表【O(N),其中 N 是数组中的元素数量】方法三:哈希表【O(N),其中 N 是数组中的元素数量】剑指 Offer 03. 数组中原创 2021-05-27 23:32:00 · 1691 阅读 · 0 评论 -
LeetCode-题目详解(二):归并排序【时间:O(nlogn)、稳】、快速排序【二路快排、三路快排】、选择排序【时间:O(n^2)、不稳】、堆排序【时间:O(nlogn)、不稳】
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。示例 1:示例 2:提示:179. 最大数给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。示例 1:示例 2:示例 3:示例 4:提示:方法一:选择排序方法二:快速排序方法三原创 2021-05-27 23:31:01 · 486 阅读 · 0 评论 -
LeetCode-题目详解(三):二分查找法【 O(logn)】
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。示例 1:示例 2:示例 3:示例 4:示例 5:提示:方法一:二分查找【时间复杂度:O(log(m+n))O(log(m+n))O(log(m+n))】方法二:一般看到O(log())级别的,就先想二分,分而治之的那些思想。比如归并排序,快排……本题主要处理好边界问题,相对于思想,边界处理和代码技巧更重要方法三:https://leetcode-cn.com/pr原创 2021-05-13 22:42:15 · 1027 阅读 · 1 评论 -
LeetCode-题目详解(四):二叉树(Tree)【遍历方式(前序、中序、后序、层序)、属性(对称、深度、平衡、路径)、修改与构造(翻转、合并)、公共祖先问题、二叉树之间的关系(相同、子树)】
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。示例 1:示例 2:示例 3:示例 4:示例 5:提示:进阶:递归算法很简单,你可以通过迭代算法完成吗?递归方法:94-二叉树的中序遍历给定一个二叉树的根节点 root ,返回它的 中序 遍历。示例 1:示例 2:示例 3:示例 4:示例 5:提示:进阶: 递归算法很简单,你可以通过迭代算法完成吗?145-二叉树的后序遍历给定一个二叉树,返回它的 后序 遍历。示例:进阶: 递归算法很简单,你可以通过迭代算原创 2021-05-13 16:35:14 · 1470 阅读 · 0 评论 -
LeetCode-题目详解(五):二叉搜索树【遍历、验证、属性、修改、构造、插入节点、删除节点、修剪】
遇到二叉搜索树,立刻想到这句话:「二叉搜索树(BST)的中序遍历是有序的」。这是解决所有二叉搜索树问题的关键。给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:示例 1:示例 2:方法一:递归方法方法二:中序递归遍历(判断节点的有序性)方法三:中序递归遍历(转为有序数组)思路简单:将中序遍历的值一个个存入一个list中。理解二叉搜索树后,明白二叉搜索树中序遍历后是个递增序列。最后判断list是否为一个递增序列即可。255. 验证前序遍历序列二叉搜索树原创 2021-05-27 23:37:51 · 399 阅读 · 1 评论 -
LeetCode-题目详解(六):链表【链表的中间节点:左半链表的结尾节点】【slow = head | fast = head | while fast and fast.next】
当「乌龟」和「兔子」从链表上的同一个节点开始移动时,如果该链表中没有环,那么「兔子」将一直处于「乌龟」的前方;链表具有天然的递归性,一个链表例如 1->2->3->4->5->NULL ,可以看成头节点(节点值为 1 的节点)后面挂接一个更短的链表(缺少节点值为 1 的节点,以节点值为 2 的节点为头节点) 1->更短的链表,依次类推。这样以来,我们首先使用哈希表进行定位,找出缓存项在双向链表中的位置,随后将其移动到双向链表的头部,即可在 O(1) 的时间内完成 get 或者 put 操作。原创 2021-05-27 23:33:25 · 2072 阅读 · 1 评论 -
LeetCode-题目详解(七):栈【Stack】、队列【Queue】、堆【python(默认小根堆):heap、C++(默认大根堆):priority_queue】【单调递增、递减栈】【单调队列】
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:示例 1:示例 2:示例 3:示例 4:示例 5:提示:1原创 2021-05-27 23:34:12 · 658 阅读 · 1 评论 -
LeetCode-题目详解(八):哈希表【Python:dict = {}】【C++:unordered_map<int, int> map】
我们同样也可以在遍历数组 nums 时候使用打擂台的方法,维护最大的值,这样省去了最后对哈希映射的遍历。给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j)原创 2021-05-13 22:57:50 · 300 阅读 · 1 评论 -
LeetCode-题目详解(九):双指针【left/right指针;slow/fast指针】、滑动窗口、多指针
滑动窗口法是指通过 left 以及 right 指针来框定一个窗口,当在窗口内的字符串满足题目要求则记录下当前窗口长度并进一步扩张寻找更长的窗口,若不满足则进行窗口平移。滑动窗口法的模板简单介绍上面的模板,模板的思想是:以右指针作为驱动,拖着左指针向前走。右指针每次只移动一步,而左指针在内部 while 循环中每次可能移动多步。右指针是主动前移,探索未知的新区域;左指针是被迫移动,负责寻找满足题意的区间。模板的整体思想是:模板中为什么不把 dict 放在 while 循环内部呢?因为如果放在 while原创 2021-05-14 09:12:43 · 2215 阅读 · 0 评论 -
LeetCode-题目详解(十):递归【深度优先遍历(DFS;前序遍历、中序遍历、后序遍历)】【岛屿问题、水域问题、单词搜索问题】、【广度优先遍历(BFS;借助queue结构)】
对于递归要分清以下概念:在 LeetCode 中,「岛屿问题」是一个系列系列问题,比如:L200. 岛屿数量 (Easy)463. 岛屿的周长 (Easy)695. 岛屿的最大面积 (Medium)827. 最大人工岛 (Hard)我们所熟悉的 DFS(深度优先搜索)问题通常是在树或者图结构上进行的。而我们今天要讨论的 DFS 问题,是在一种「网格」结构中进行的。岛屿问题是这类网格 DFS 问题的典型代表。网格结构遍历起来要比二叉树复杂一些,如果没有掌握一定的方法,DFS 代码容易写得冗长繁杂。本文将原创 2021-05-27 23:38:19 · 374 阅读 · 1 评论 -
LeetCode-题目详解(十一):回溯算法【递归回溯、迭代回溯】【DFS是一个劲往某一个方向搜索;回溯算法建立在DFS基础之上,在搜索过程中,达到结束/裁剪条件后,恢复状态,回溯上一层,再次搜索】
DFS 是一个劲的往某一个方向搜索,而回溯算法建立在 DFS 基础之上的,但不同的是在搜索过程中,达到结束条件后,恢复状态,回溯上一层,再次搜索。因此回溯算法与 DFS 的区别就是有无状态重置「回溯法」实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就「回溯」返回,尝试别的路径。回溯法是一种算法思想,而递归是一种编程方法,回溯法可以用递归来实现。回溯法的整体思路是:搜索每一条路,每次回溯是对具体的一条路径而言的。对当前搜索路径下的的未探索区域进行搜索,则可能有原创 2021-06-14 22:50:53 · 459 阅读 · 0 评论 -
LeetCode-题目详解(十二):动态规划(自底向上求解最终结果)【构建dp数组、初始化dp数组(可明显确定的边界情况)、定义状态、构建状态转移方程】、记忆化搜索(自顶向下求解最终结果)
最优化原理指的最优策略具有这样的性质:不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略。简单来说就是一个最优策略的子策略也是必须是最优的,而所有子问题的局部最优解将导致整个问题的全局最优。如果一个问题能满足最优化原理,就称其具有最优子结构性质。这是判断问题能否使用动态规划解决的先决条件,如果一个问题不能满足最优化原理,那么这个问题就不适合用动态规划来求解。整体来说,动态规划算法的时间复杂度比记忆化搜索好,因为没有递归调用函数的时间、以及系统的栈空间。一般来说,自上而下的解原创 2021-05-27 23:34:48 · 483 阅读 · 1 评论 -
LeetCode-题目详解(十三):字符串【KMP 算法】
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1。原创 2022-12-22 22:10:43 · 272 阅读 · 0 评论 -
LeetCode-题目详解:贪心算法【无套路、无框架】
因为贪心无套路!没有个整体的贪心框架解决一些列问题,只能是接触各种类型的题目锻炼自己的贪心思维!给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。示例 1:示例 2:提示:方法二:贪心(反向推导)可以正向推,也可以反向推,思路是共用的。这里解释一下反向推。定义一个end变量,我们叫它终点。最开始的终点是len - 1。能否到达终点,就看它的:所以我们把这个位置定为新终点。继续看它的前一个/两个/三原创 2021-08-31 22:10:02 · 270 阅读 · 0 评论 -
LeetCode-题目详解:位运算
136. 只出现一次的数字给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,1]输出: 1示例 2:输入: [4,1,2,1,2]输出: 4方法一:位运算异或运算 ⊕。异或运算有以下三个性质:任何数和 00 做异或运算,结果仍然是原来的数,即 a⊕0=a。任何数和其自身做异或运算,结果是 00,即 a⊕a=0。异或运算满足交原创 2021-07-03 16:23:59 · 126 阅读 · 0 评论