自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(20)
  • 收藏
  • 关注

原创 快速排序及快速选择算法详解

快速排序快速排序就是一个二叉树的前序遍历快速排序是先将一个元素(p)排好序,然后再将剩下的元素排好序排序完成其实形成的 是一棵二叉搜索树,如此可以理解为,快速排序的过程是一个构造 二叉搜索树的过程即如下二叉搜索树二叉搜索树的构造时,二叉搜索树不平衡的极端情况下二叉搜索树会退化成一个链表,导致操作效率大幅降低,快速排序中也有类似的情况,如图所示因此要引入随机性:可采用进行排序前对整个数组执行 洗牌算法 进行打乱,或者在 partition函数中随机选择数组元素作为切分点,我倾向于使用洗牌算法快速排序的代码框架

2022-06-06 19:34:29 1547

原创 二叉搜索树特性及相关算法详解

特性关于LeetCode230 二叉搜索树中第K小的元素的优化不难发现,如下解法中,算法时间复杂度为O(N),而基于BST的各种自平衡BST增删查改都是O(logN),因此如下解法过于低效BST的操作为什么这么高效就拿搜索某一个元素来说,BST能够在对树时间内找到该元素的根本原因还是在BST的定义里,左子树小于根节点,右子树大于根节点,因此搜索范围直接变为一半,这就给我们的优化提供了思路想找到第k小的元素,或者说找到排名为k的元素,关键在于每个节点得知道他自己排名第几比如找排名为k的元素,当前节点知道自己排

2022-06-06 19:32:57 319

原创 归并排序 及其算法应用 LeetCode Hard题详解 LeetCode315 493 327

归并排序归并排序的过程可以在逻辑上抽象为一棵二叉树,树上的每个节点的值可以认为是nums[lo…hi],叶子节点的值就是数组中的单个元素,树高logN,每层都是N,因此算法时间复杂度O(NlogN)merge操作会在二叉树的每个节点上都执行一边,执行顺序就是二叉树后序遍历的顺序,因为他的位置在后序遍历位置归并排序算法模版LeetCode315 计算右侧小于当前元素的个数思路分析为何使用归并排序主要在merge函数,我们在使用merge函数合并两个有序数组的时候,其实是可以知道一个元素nums[i]

2022-06-05 20:19:57 294

原创 LeetCode297 二叉树的序列化与反序列化

LeetCode297 二叉树的序列化与反序列化思路分析前序遍历方式将二叉树使用前序遍历打平到一个字符串中,使用SEP = ","表示分隔符,NULL = "#"表示空指针将字符串根据SEP分割成nodes。一般来说,单单前序遍历结果是不能还原二叉树结构的,因为缺少空指针的信息,至少要得到前、中、后序遍历中的两种才能还原二叉树。但是这里的nodes列表包含空指针(#)的信息,因此使用nodes列表就可以还原二叉树过程也是前序遍历后序遍历方式将二叉树使用后序遍历打平到一个字符串中,使用SEP = ","表示分

2022-06-04 11:43:45 185

原创 二叉树的构造问题

二叉树的构造问题一般都是使用 分解问题 的思路 :构造整棵树 = 根节点 + 构造左子树 + 构造右子树LeetCode654 最大二叉树思路分析代码实现LeetCode105 从前序与中序遍历序列构造二叉树思路分析确定根节点的值,先构建根节点,再根据根节点递归构造左右子树即可确定根节点的值rootVal:前序遍历的preOrder[preStart]就是根节点的值rootVal,例如preOrder[0],即3为二叉树的根节点确定根节点在中序遍历的索引index以确定左右子树的大小leftSiz

2022-06-03 16:48:23 132

原创 二叉树算法套路/模版

二叉树算法套路模版

2022-06-03 10:27:43 121

原创 LeetCode316 去除重复字母

LeetCode316 去除重复字母思路分析题意分析解题思路使用栈,即单调栈来实现要求1和2,使用boolean[] inStack记录栈中元素达到去重目的使用栈的原因:利用栈的先进后出特性,我们可以立即操作刚插入的字符当要压栈的元素比栈顶元素小时,弹出栈顶元素,达到2有两种情况因此需要使用int[] count在最初记录每个字符的个数,在pop前判断栈顶字符是否唯一最后pop出的所有元素要reverse代码实现

2022-06-02 15:11:25 69

原创 常数时间删除/查找数组中的任意元素 LeetCode710 LeetCode380

LeetCode380 O(1)时间插入、删除和获取随机元素思路分析代码实现LeetCode710 黑名单中的随机数思路分析题目分析要求我们在[0, n-1]中排除掉黑名单数组后等概率返回剩余某一个数例如:输入N = 5, blacklist = [1, 3],多次调用pick函数,会等概率随机返回0,2,4中的某一个数且题目要求使用最少的random解题思路与上一题类似,我们可以将区间[0, N]看作一个数组,然后将blacklist中的元素移到数组中的最末尾last = N -1,同时用一个哈

2022-06-02 14:41:26 121

原创 LeetCode870 优势洗牌 田忌赛马问题

LeetCode870 优势洗牌思路分析本题相当于田忌赛马,尽可能多的让nums1[i] > nums2[i]策略:将nums1升序排列,将nums2降序排列(因为nums2中元素的顺序不能改变,计算结果的顺序依赖nums2的顺序,因此利用PriorityQueue放入int[]{i, nums2[i]}),然后一一对比:如果nums1[right]大于maxval,即nums1的最大值大于了nums2的最大值,那么直接写入res数组中对应索引;否则,将nums1的最小值写入res数组中对应索引使用双指针技

2022-06-02 13:31:37 199

原创 二分查找算法运用框架 LeetCode410 LeetCode1011 LeetCode875

二分搜索问题的泛化首先,从题目中抽象出一个自变量x,一个关于x的函数f(x),以及一个目标值targetx,f(x),target要满足以下条件f(x)必须是在x上的单调函数(单调增单调减都可以)题目是让我计算满足约束条件f(x) == target时的x的值:例如一个升序排列的有序数列nums以及一个目标元素target,请你计算target在数组中的索引位置,如果有多个目标元素,返回最小的索引,这就是搜索左侧边界,此时x为索引,f(x)为nums[x],计算满足f(x) == target的x的最小值框

2022-06-02 01:06:25 73

原创 LeetCode528 按权重随机选择

LeetCode528 按权重随机选择思路分析使用前缀和技巧加入我输入的权重数组w = [1, 3, 2, 1],则让概率符合权重,可以抽象为如下线段index 0 1 2 3w 1 3 2 1preSum 1 4 6 7如果我随机生成一个[1, 7]之间的整数,该数落在哪个颜色的线段上,就选择该颜色对应的权重索引,例如:若生成了target = 5,

2022-06-01 16:41:18 1088

原创 滑动窗口算法总结 LeetCode3 LeetCode438 LeetCode567

滑动窗口算法框架:套模版需要考虑的四个问题LeetCode567 字符串的排列思路分析:使用滑动窗口算法框架,考虑四个问题得出:移动right时更新windowMap,valid;当right-left == s1.length()时停止收缩;当移动left时更新windowMap,valid;要在缩小窗口时判断valid是否等于targetMap.size(),如果等于返回true,不等继续循环代码实现LeetCode438 找所有字母异位词思路分析:与上一题(寻找字符串的排列)类似,只

2022-06-01 12:50:18 74

原创 LeetCode76 最小覆盖字符串,滑动窗口问题

LeetCode76 最小覆盖子串思路分析:在第2步找到一个 可行解 ,在第3步优化这个 可行解 ,在第4步找到最优解图解不断增加right扩大窗口不断增加left缩小窗口重复 增加right 满足要求,发现 len 更小right到达s的尽头代码实现

2022-06-01 01:05:37 257

原创 LeetCode54 和 59 螺旋矩阵

LeetCode54 螺旋矩阵思路分析:解题的核心思路是按照右下左上的顺序遍历数组,并使用四个边界变量圈定未遍历的边界代码实现LeetCode59 螺旋矩阵II思路分析:与上一题类似,核心思路是右下左上遍历创建的matrix数组,并添加元素,即生成矩阵代码实现

2022-05-31 22:25:45 69

原创 LeetCode 1109 LeetCode 370 差分数组算法技巧

LeetCode370 区间加法思路分析使用差分数组的解题技巧差分数组:主要适用场景是频繁对原始数组的某个区间的元素进行增减;类似于前缀和构造的prefix数组,我们构造一个差分数组diff。diff[i] = nums[i] - nums[i - 1]示意图运用差分数组进行区间增删的操作若对nums[i…j]增(删) value :则diff[i] += value,即nums[i…]增加了value之后diff[j+1] -= value,即对nums[j…]减少了value,综合起来就是没有变化返回结

2022-05-31 21:23:43 237

原创 前缀和数组问题LeetCode304

LeetCode303 区域和检索 - 数组不可变1. 解题技巧:**前缀和数组**,这是一道标准的前缀和问题2. 思路分析 1. 若如下题解,效率很差,因为sumRange方法会被频繁调用,但是他的时间复杂度为O(N),N为nums数组的长度 ``` class NumArray { private int[] nums; public NumArray(int[] nums) { .

2022-05-21 22:49:36 231

原创 数组相关算法以及双指针运用

数组算法快慢指针的常用算法LeetCode26 删除有序数组中的重复项题目说明:原地只不能创建新数组再拷贝思路分析使用快慢指针的技巧定义fast和slow,初始化为索引0。我们让fast走在slow前,每当nums[slow] != nums[fast]时,slow向前前进一步,并将nums[fast]赋值给nums[slow]这样保证数组nums[0]到nums[slow]都是不重复的元素,返回slow + 1即为不重复元素数组的长度示意图代码实现

2022-05-21 19:37:19 169

原创 LeetCode234 回文链表多解

LeetCode234 回文链表解法一:将原始链表的值存入ArrayList中,然后将原始链表反转后值再存入ArrayList中,进行循环比较解法二:树结构是链表结构的衍生,二叉树的遍历对链表同样适用链表也可以有前序遍历和后序遍历void traverse(ListNode head) { // 前序遍历代码 traverse(head.next); // 后序遍历代码}使用链表的后序遍历加上双指针完成class Solution { Lis

2022-05-19 22:56:07 385

原创 LeetCode25 K个一组反转链表

LeetCode25 K个一组反转链表代码实现class Solution { public ListNode reverseKGroup(ListNode head, int k) { if (head == null) return null; ListNode a, b; a = b = head; for (int i = 0; i < k; i++) { if (b == null) {

2022-05-19 21:13:18 198

原创 LeetCode206 反转链表的两种实现

LeetCode206 反转链表解题思路双指针法:定义一个cur指向head,pre指向null,temp指向null(定义temp是为了保存cur.next)temp指向cur.nextcur.next指向prepre指向curcur指向temp​ 第一次迭代后​ 继续循环迭代到最后一次cur == null​ 此时pre即为反转链表的头节点,返回pre即可class Solution { public ListNode reverseList(Lis

2022-05-19 15:58:24 124 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除