Leetcode单调队列、优先队列(堆)、单调栈、归并排序刷题总结

【C++】单调队列 详解 今天我们来讲一下单调队列与栈。 这两种数据结构虽然没有在c++的stl中有直接的实现,但是在做题过程中,很容易有单调队列(栈)的使用,尤其是在一些比较难的题目中。 目录单调队列1.1 单调队列介绍1.2 单调队列的应用1.2.1 滑动窗口最大值1.2.1.1 题目描述1.2.1.2 结题思路方法一(优先队列)方法二 (单调队列)1.3 单调队列的模拟实现1.4 其他例题 单调队列 1.1 单调队列介绍 单调队列 是 队列中元素之间的关系具有单调性,而且,队首和队尾都可以进行出队操作,只有队尾可以进行入队 阅读详情

一、单调队列

1. 理论基础

  • 定义
    单调队列为何说单调,因为是队列中的元素始终保持着单增或者单减的特性。(注意始终保持这四个字)
    其实单调队列不只是做到了排序,还可以实现一个功能:在每次加入或者删除元素时都保持序列里的元素有序,即队首元素始终是最小值或者最大值,这个功能非常重要,单调队列我们就是使用的这个功能。
  • 例子
    我们依次加入5个元素,分别为5,8,2,4,1
    那么我们假设队列是单减的,那么队首元素始终是最大的,五次操作后的队列元素排列情况如下:
1: 5
2: 8
3: 8 2
4: 8 4
5: 8 4 1

1.首先队列里面没有元素,5加进去。
2.第二个元素8大于队尾的元素,所以5要弹出去,8加进去。保持队首最大
3.第三个元素2小于队尾元素8,可以加进去,变为8 2
4.4大于队尾元素2,2弹出,4小于8,8不弹出,4加进去
5.1小于队尾元素4,1加进去,最后队列为8 4 1

  • 设计方案

1.队首(左边)判定元素是否出队
由于单调队列左边必定是最大值(最小值),根据题目要求判定单调队列左边是否要出队

2.队尾(右边)通过循环不断删除结点
右边通过一个 while 循环不断删除队尾元素,来保证较大(较小)的元素成功在右边入队,以此来维护单调队列

3.最右边新元素入队
当最右边元素入队之后,就成功维护一个新的单调队列

2. T239 滑动窗口最大值

在这里插入图片描述

  • 代码实现
class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if(nums.length == 1){return nums;}
        int len = nums.length - k + 1;//滑窗数组的长度
        int[] res = new int[len];//存放结果
        //初始化结果
        MyQueue que = new MyQueue();
        for(int i =0;i<k;i++){
            que.add(nums[i]);
        }
        res[0] = que.peek();
        int num = 1;
        for(int i = k;i<nums.length;i++){//i记录每次滑窗的最右端
            que.pop(nums[i-k]);//移动滑窗,删除第一个元素
            que.add(nums[i]);//把最后的元素加进去队列
            res[num] = que.peek();
            num++;
        }
        return res;
    }
}
//单调队列
//每次用peek取出的元一定是该队列的最大值
class MyQueue{
    Deque<Integer> deque = new LinkedList<>();
    //入队操作:保证单调递减。while循环 如果该值比最后一个元素大,那就弹出最后一个元素,继续比较,知道满足条件
    void add(int val){
        while(!deque.isEmpty() && val > deque.getLast()){
            deque.removeLast();
        }
        deque.add(val);
    }
    //出队操作:并不是针对队列出队,而是需要将队列与数组进行比较。仅仅当peek出来的元素与需要弹出的数据相等时,才将其弹出。因为仅仅peek出来的数据影响取最大值
    void pop(int val){
        if(!deque.isEmpty() && val == deque.peek()){
            deque.poll();
        }
    }
    //返回最大值
    int peek(){
        return deque.peek();
    }
}

二、优先队列(堆)

1. 理论

1.1 语法

  • 定义
    对于堆(使用PriorityQueue实现):从队头到队尾按从小到大排就是最小堆(小顶堆),
    从队头到队尾按从大到小排就是最大堆(大顶堆)—>队头元素相当于堆的根节点
  • 比较器
    PriorityQueue 默认是小根堆,大根堆需要重写比较器(一定要记住相关语法,哪个是大哪个小顶堆)。
    可以在 new PriorityQueue<>() 中的参数部分加入比较器。
    具体写法是:(v1, v2) -> v2 - v1。
    Queue 类的输入是 offer() 方法/add,弹出是 poll() 方法。

1.2 优先队列 单调队列的区别

5 8 4依次入队
优先队列 前几个最大或者最小值,java内置的PriorityQueue
5
8 5
8 5 4
单调队列 滑窗求最值,需要自己构造java不提供
5
8
8 4

1.3 PriorityQueue示例代码

class Debug{
    public static void main(String[] args) {
        PriorityQueue<Integer> pq = new PriorityQueue<>();
        pq.offer(5);
        pq.offer(3);
        pq.offer(2);
        pq.offer(6);
        System.out.println(pq);
        pq.poll();
        System.out.println(pq);
    }
    //结果
//[2, 5, 3, 6]
//[3, 5, 6]


}

T347. 前k个高频元素 (大顶堆) **

在这里插入图片描述

  • 思路分析
    建立个大顶堆,频率次数高的元素在队头,优先出来(有一些题解强调要小顶堆 不理解!)
    小技巧:如何遍历一个map集合
    getOrDefault方法
  • 代码实现
class Solution {
    //优先队列实现大顶堆
    //getOrDefault() 方法获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值。
    public int[] topKFrequent(int[] nums, int k) {
        //1.计算值与出现频率
        Map<Integer,Integer> map = new HashMap<>();
        for(int i=0;i<nums.length;i++){
            map.put(nums[i],map.getOrDefault(nums[i],0)+1);
        }
        //2.创建大顶堆(从大到小),然后把map的值放到里面
        //大顶堆  [ [key,count], ... ]
        PriorityQueue<int[]> pq = new PriorityQueue<>( (x,y) -> y[1]-x[1]);
        //用map.entrySet 把map解析为 entry类型
        for(Map.Entry<Integer,Integer> entry:map.entrySet()){
            pq.add(new int[]{entry.getKey(),entry.getValue()});
        }
        //3.存放结果
        int[] res = new int[k];
        for(int i = 0;i<k;i++){
            res[i] = pq.poll()[0];
        }
        return res;
    }
}

面试题 17.14 最小K个数 (小顶堆) *

在这里插入图片描述

class Solution {
    //小顶堆
    public int[] smallestK(int[] arr, int k) {
        PriorityQueue<Integer> pq = new PriorityQueue<Integer>((x,y)->(x-y));//小顶堆
        for(int i=0;i<arr.length;i++){
            pq.offer(arr[i]);//队头到队尾:从小到大
        }
        int[] res = new int[k];
        for(int i=0;i<k;i++){
            res[i] = pq.poll();
        }
        return res;
    }
}

面试题 17.09. 第 k 个数

T692. 前k个高频单词

三、单调栈

通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。

  • 相关题目
    T739. 每日温度(单调递增)
    T496. 下一个更大元素
    T503. 下一个更大元素Ⅱ (循环数组)
    T42. 接雨水
    见单调栈总结

四、归并排序

1. 理论基础: 递归+合并

  • 1.1 合并两个有序数组
a[5] = {3,5,7,8,10}
b[7] = {1,2,4,5,8,11,12,}

核心思想:

  • 定义一个新数组c,可以容纳a和b两个数组中的所有元素;

  • 初始化三个下标(都指向第一个元素),i给a数组,j给b数组,k是新数组c的;

  • a[i]和b[j]进行比较:若a[i]<b[j],将a[i]填入c[k],i++,k++;若a[i]>b[j],将b[j]填入c[k],j++,k++;

  • 循环第三步,直至其中一个数组中的数据全部填入数组c中,再将另外一个还有剩余的数组中的元素放入新数

  • 1.2 归并排序(合并+递归思想)
    我们的归并排序就是先使用递归将数组中元素进行划分,直至划分得到单个元素作为一个数组,此时就可以将其看作一个有序数组(只有一个元素自然是有序的)进行归并。最终将所有元素归并得到一个有序数组,所以这种排序方法称作为归并排序。
    在这里插入图片描述

  • 1.3 代码实现

    //归并排序入口
    public void mergeSort(int[] nums){
        MergeSort(nums,0,nums.length-1);
    }
    /**
     * 归并排序,左闭右闭原则
     * @param nums 待排序数组
     * @param start 数组开始的下标
     * @param end 数组结束的下标
     */
    private void MergeSort(int[] nums,int start,int end){
        if(start<end){
            int mid=start+(end-start)/2;
            MergeSort(nums,start,mid); //将无序数组划分
            MergeSort(nums,mid+1,end); //将无序数组划分
            merge(nums,start,mid,end); //再将两个有序数组合并
        }
    }
    /**
     *  双指针合并两个有序数组
     * @param nums
     * @param start
     * @param mid
     * @param end
     */
    private void merge(int[]nums, int start, int mid, int end){
        int P1=start;//第一个数组的开始索引
        int P2=mid+1;//第二个数组的开始索引
        int tmp[]=new int[end-start+1]; //需要借助额外的O(n)空间来存储合并后的数组
        int cur=0;
        while (P1<=mid&&P2<=end){//先对两个数组一一比较
            if(nums[P1]<nums[P2]){
               tmp[cur]=nums[P1];
               P1++;
            }else {
               tmp[cur]=nums[P2];
               P2++;
            }
            cur++;
        }
        //若两个数组还有剩余的数 再进行比较
        while (P1<=mid){
            tmp[cur]=nums[P1];
            P1++;
            cur++;
        }
        while (P2<=end){
            tmp[cur]=nums[P2];
            P2++;
            cur++;
        }
        for (int i = 0; i < res.length ; i++) {
             nums[i+start]=tmp[i];
        }
    }

2. 剑指Offer 51. 数组中的逆序对

在这里插入图片描述

  • 思路分析
    进行归并排序,再合并的时候计算逆序对
    具体可以参考以上图,或者此题解的动态ppt
  • 代码实现
class Solution {
    //归并排序:从小到大
    int count = 0;
    public int reversePairs(int[] nums) {
        mergeSort(nums,0,nums.length-1);
        return count;
    }
    /**   归并排序 左闭右闭
     */
    private void mergeSort(int[] nums,int start,int end){
        if(start<end){
            int mid = start + (end-start)/2;
            mergeSort(nums,start,mid);//划分左数组
            mergeSort(nums,mid+1,end);//划分右数组
            merge(nums,start,mid,end);//合并数组
        }
    }
    /**双指针合并数组
     */
    private void merge(int[] nums,int start,int mid,int end){
        int index1 = start;//第一个数组的开始索引
        int index2 = mid+1;//第二个数组的开始索引
        int cur = 0;
        int[] temp = new int[end-start+1];
        while(index1<=mid&&index2<=end){
            if(nums[index1]<=nums[index2]){
                temp[cur] = nums[index1];
                index1++;
            }else{//前面比后面大
                temp[cur] = nums[index2];
                index2++;
                count += (mid-index1+1);
            }
            cur++;
        }
        while(index1<=mid){
            temp[cur] = nums[index1];
            index1++;
            cur++;
        }
        while(index2<=end){
            temp[cur] = nums[index2];
            index2++;
            cur++;
        }
        for(int i=0;i<temp.length;i++){
            nums[i+start] = temp[i];
        }
    }
}

3. T315. 计算右侧小于当前元素的个数

在这里插入图片描述

  • 思路分析
    归并排序,在合并的过程中计算右侧小于当前元素的个数
  • 代码实现
class Solution {
    //难点1:保证在排序过程中坐标对应起来,用index和tempIndex数组
    int[] index ;
    int[] tempIndex;
    int[] res;
    //难点2:计算右侧小于当前元素个数:当此元素a比第二个数组的元素b小时 第二个数组中 从头到元素b的元素个数(不算b)
    public List<Integer> countSmaller(int[] nums) {
        index = new int[nums.length];
        tempIndex = new int[nums.length];
        res = new int[nums.length];
        for(int i=0;i<nums.length;i++){
            index[i]=i;
        }
        mergeSort(nums,0,nums.length-1);
        List<Integer> list = new ArrayList<>();
        for(int num:res){
            list.add(num);
        }
        return list;
    }
        /**   归并排序 左闭右闭
     */
    private void mergeSort(int[] nums,int start,int end){
        if(start<end){
            int mid = start + (end-start)/2;
            mergeSort(nums,start,mid);//划分左数组
            mergeSort(nums,mid+1,end);//划分右数组
            merge(nums,start,mid,end);//合并数组
        }
    }
    /**双指针合并数组
     */
    private void merge(int[] nums,int start,int mid,int end){
        int index1 = start;//第一个数组的开始索引
        int index2 = mid+1;//第二个数组的开始索引
        int cur = 0;
        int[] temp = new int[end-start+1];
        while(index1<=mid&&index2<=end){
            if(nums[index1]<=nums[index2]){
                temp[cur] = nums[index1];
                tempIndex[cur] = index[index1];
                res[index[index1]] += (index2-mid-1);
                index1++;
            }else{//前面比后面大
                temp[cur] = nums[index2];
                tempIndex[cur] = index[index2];
                index2++;
            }
            cur++;
        }
        while(index1<=mid){
            temp[cur] = nums[index1];
            tempIndex[cur] = index[index1];
            res[index[index1]] += (index2 -mid -1);
            index1++;
            cur++;
        }
        while(index2<=end){
            temp[cur] = nums[index2];
            tempIndex[cur] = index[index2];
            index2++;
            cur++;
        }
        for(int i=0;i<temp.length;i++){
            index[i+start] = tempIndex[i];//把临时的index赋值给index 算结果res的时候始终用index
            nums[i+start] = temp[i];
        }

    }
}
单调队列 文章目录单调队列单调队列的应用滑动窗口单调队列与优先队列 单调队列 顾名思义,单调队列就是具有单调性的队列,我们需要用双端队列来实现。 双端队列与普通队列的唯一区别就是它可以从两边弹出。 打个形象一点儿的比方 一群人在食堂排队打饭 这个时候来了一个新的小伙伴 这个小伙伴很霸道地想要去插队,其他小伙伴们肯定不会同意,但是打不过这个新伙伴,于是就被赶走了。 但是呢,它又打不过最前面的那个6,于是... 阅读详情

相关推荐

单调队列【deque】 & 队列【STL】& 洛谷P1886 滑动窗口 & 洛谷P9905 [COCI 2023_2024 #1] AN2DL 【矩阵区间最大值】

单调队列【deque】 & 队列【STL】& 洛谷P1886 滑动窗口 & 洛谷P9905 [COCI 2023/2024 #1] AN2DL 【矩阵区间最大值】

Xeove的博客 1109

单调队列【总结】

一、基本概念 单调队列是指:单调递增或单调递减的队列。所以它也有如下几个性质: 1.队列中的元素在原来的列表中的位置是由前往后的(随着循环顺序入队)。 2.队列中元素的大小是单调递增或递减的。 3.从队尾入列,队首或队尾出列 时间复杂度:O(N) 二、例题 1.最大子序和(dp+单调队列优化) 题目描述 输入一个长度为n的整数序列,从中找出一段不超过m的连续子序列,使得整个序列的和最大。 例如 1,-3,5,1,-2,3 当m=4时,S=5+1-2+3=7 当m=2或m=3时,S=5+1=6 输入 第一行两

算法小猪的博客 2146

大厂算法通关:ACWing基础课+提高课 知识点学习&刷题顺序

本顺序,严格遵循「先基础后进阶、先无依赖后有依赖、先高频后低频」的原则,同时对ACWing课程内容做了,剔除了99%大厂面试不考的纯竞赛向内容,避免无效学习。

2401_87003328的博客 720

[数据结构]--单调队列

类比单调栈队首到队尾单调递增/递减。

weixin_74375289的博客 3286

【可复用性、可测试性、可理解性】算法与数据结构按汇总

本文的算法汇总,包括但不限于动态规划、回溯、贪心、分支、图论、组合数学、数量等。

闻缺陷则喜何志丹 6772

不会ps,你也可以成为ps高手,最强傻瓜式人像一键磨皮美白瘦脸美妆PS插件

比如:美肤是用来去斑点的,如果效果不太理想,就加大百分比,反之就减小。瘦脸如果脸胖的就打开,正常的就关闭。所谓的一键调节,要不只能调节一种效果,要不就是个预设,然后让你自己再调。同时,该软件还加入了贴心的批量处理功能,能同时处理上千张照片,让您喝着茶也能将工作做完。、自动检测照片中的人脸,包括鼻子,嘴巴,耳朵,眼睛和眉毛。、依托强大的脸部识别功能,可以高效的对人物全身皮肤进行智能识别,处理,使肤质平滑、过渡均匀。,这是网上下载的模糊照片,经过简单处理,你可以发现,眼睛变的更亮,皮肤更白,眼袋消失。

心语家园 - www.xinyucn.cc 2897

【力扣】刷题总结

四:总的策略合起来最大(遍历判断要定位的为第i点)

weixin_43843390的博客 830

汽车电子电气架构

控制器:从多独立 ECU → 域控制器(DCU) → 中央计算平台 + 区域控制器,硬件集成度持续提升,冗余减少;算力:从分散无集中算力 → 按域分配算力 → 全域算力集中,算力量级从 MIPS 跃升至 TOPS,支撑高阶智驾;网络:从低速 CAN/LIN 独占 → 以太网为主、总线为辅 → 高速以太网主干,数据传输速率提升千倍;软硬件:从软硬件深度绑定 → 初步解耦 → 完全解耦(SOA),实现 “硬件预埋、软件解锁”;线束。

LXY_LXY_的博客 1436

2026秋招Leetcode刷题记录

常见考点:前缀和(区间和查询)、差分数组(批量区间修改)、二分查找(变种:找插入位置、旋转数组找最小值)、指针(三数之和、移除元素)、滑动窗口(子数组最大和、最长无重复子串)、多维数组。常见考点:前 / 中 / 后序遍历(递归 + 迭代实现)、层序遍历(BFS)、从前序 + 中序、后序 + 中序还原二叉树、对称二叉树、平衡二叉树判断、二叉树直径 / 深度计算。常见考点:反转链表(全反转、部分反转)、环检测与入口查找(快慢指针)、删除倒数第 k 个节点、合并有序链表(递归 / 迭代)

想买很多漂亮衣服但是买不起的博客 1166

PVE(Proxmox VE)添加VMware Esxi并迁移虚拟机

跨平台迁移虚拟机:从VMware虚拟化平台迁移虚拟机到PVE平台。

VEGETA的博客 7713

TP4056在单节锂电池充电管理中的创新应用与电路优化

本文深入探讨了TP4056线性充电管理芯片在单节锂电池充电电路中的创新应用与优化方案。针对“边充边用”的核心挑战,文章详细解析了利用PMOS管构建智能供电切换电路的原理,实现了外部电源与电池供电的无缝、安全切换,有效杜绝了电池“边充边放”的风险。同时,提供了关键的元器件选型、PCB布局布线技巧及常见问题排查指南,为创客和硬件开发者提供了高性价比、高可靠性的锂电池电源管理实践方案。

rock5的博客 501

LeetCode热题100plus

(简单)给定一个整数数组nums和一个整数目标值target,请你在该数组中找出 和为目标值target的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。你可以按任意顺序返回答案。方法一(自己想到):暴力枚举,两次循环遍历所有相加的情况。

qq_43751506的博客 3669

PowerBuilder 9 遗留系统逆向实战:3款反编译工具对比与关键DLL破解

本文深入探讨了PowerBuilder 9遗留系统的逆向工程实战,对比分析了PBKiller、PB DeCompiler和Shudepb三款反编译工具的核心功能与适用场景,并详细解析了关键DLL破解技术。通过IDA和OllyDbg等工具的应用,提供了从静态解构到动态追踪的完整逆向方法论,帮助开发者有效维护老旧PB系统。

cucanqi9387的博客 1378

算法刷题记录——标签分类汇总(持续更新)

个人算法刷题持续记录文档的目录页。

weixin_42826353的博客 1391

45.qt quick-qml虚拟软键盘详解(一)

1.qml虚拟键盘介绍 Qt虚拟键盘的主要功能包括: 可定制的键盘布局和风格与动态切换。 带有单词选择的预测性文本输入。 角色预览和替代角色视图。 自动大小写和空格插入。 不同分辨率的可伸缩性。 支持不同的字符集(拉丁,简体/繁体中文,印地语,日语,阿拉伯语,希伯来语,韩语和其他)。 支持大多数常见的输入语言,可以轻松扩展语言支持。 从左到右和从右到左的输入。 硬件键支持2路和5路导航。 手写支持,带有全屏输入的手势。 音频反馈。 跨平台功能。 支持多国语言,高达40多个语言 本

抵抗时间扭曲,坚持做一件有意义的事 3559

Codex 100个真实案例 - 用AI做在线考试系统(自动组卷+防作弊)

本案例使用 Codex 从零搭建一个功能完整的在线考试系统。涵盖题库管理(单选/多选/判断/填空)、智能随机组卷、考试倒计时、自动判分、成绩统计分析、以及多维度防作弊机制(切屏检测、禁止复制粘贴、IP限制等)。前端使用 Vue 3 + Element Plus 构建考试界面,后端使用 Node.js + Express + MySQL 提供 API 服务。全程用自然语言驱动 Codex 完成开发,最终交付一个可直接部署的在线考试平台。

yueyeguzhuo的专栏 77

leetcode刷题日记

leetcode热题100刷题笔记

YanYuLTai的博客 323

秋招突击——笔试整理——8/25——拼多多笔试整理

继续加油! 转变思维,有简单到复杂,由直观到抽象,这种贪心模拟的题目一直是这样的!

Blackoutdragon的博客 2400

力扣刷题Day06:先懂数据结构,再谈解题效率

数据结构是计算机存储、组织数据的方式,直接决定了增删改查等核心操作的效率与成本。无论是链表、栈、队列还是二叉树,每一种结构都有其特定的适用场景和复杂度特征。理解这些底层原理,才能在算法设计与优化中做出正确选型。以力扣热题为例,链表反转考察指针操作与哨兵节点,滑动窗口最大值依赖单调队列,接雨水问题则常借单调栈维护边界——数据结构的选择往往就是解题的关键。在刷题进入第六天这一节点,从“能AC”转向“懂原理”,建立题目与结构之间的映射,正是突破瓶颈、提升解题效率的核心路径。结合408考研、软考与算法面试的实际场景

weixin_28304023的博客 233

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

数据结构与算法——LeetCode刷题记录

文章目录1. 单调栈2. 区间问题3. 最大子序和4. 滑动窗口5. 优先队列/堆6. 岛屿问题(网格DFS)7. 二分查找8. 栈9. HashSet/HashMap10. 位运算11. 链表12. 二叉树13. 设计类14. 快慢指针15. 回文16. 数字操作17. 双指针18. BFS其他 1. 单调栈 简单 496. 下一个更大元素 I 中等 402. 移掉K位数字 581. 最短无序连续子数组 739. 每日温度 901. 股票价格跨度 1081. 不同字符的最小子序列 困难 4

weixin_38938338的博客 2589

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

力扣算法题总结

题目:求最多重叠(x,y)的数量思路:按y排序,把y放入,逐个比较x,x大于优先队列的堆顶元素就弹出堆顶。

Black_cat_look的博客 1637

力扣刷题记录1

数学题,长整形的使用。

南北粉面馆 367

数据结构面试题

仅以这几篇博文记录我的秋招之路 算法岗面试题目总结 一、 面试高频问题:排序(O(1) 复杂度的归并,堆排序,快速排序) 1.归并排序 //空间复杂度O(1),时间复杂度o(nlogn) public static void main(String[] args) { int[] arr = new int[]{14,12,15,13,11,16}; //找到数组的最大值,并计算出maxval,然后调用递归的归并排序 int maxval = Arra

qq_43391419的博客 704

4.数据结构(0x3f:从周赛中学算法 2022下)

来自0x3f【从周赛中学算法 - 2022 年周赛题目总结(下篇)】:https://leetcode.cn/circle/discuss/WR1MJP/包括堆(优先队列)、单调栈、单调队列、字典树、并查集、树状数组、线段树等。学习这些只是开始,能否灵活运用才是关键。注:常见于周赛第四题(约占 21%)。

qq_42958831的博客 637

2020秋招_leetcode刷题记录

面试题 10.03. 搜索旋转数组 -> 二分查找(两次二分查找过不了特殊例子,一次二分查找理解起来有点麻烦)

XindaBlack的博客 389

leetcode经典算法题

本文整理了LeetCode算法练习题分类及题解链接,主要包含以下内容: 数据结构:LRU缓存、链表操作、二叉树遍历与构造 算法技巧:滑动窗口、单调栈/队列、优先队列 经典算法:动态规划、DFS、排序算法 图论:最小生成树、最短路径、并查集 每类问题均附有labuladong的详细题解链接,包括二叉树序列化、滑动窗口框架、回溯框架等核心算法实现。重点涵盖了链表操作、树遍历、动态规划等高频考点,并提供了Dijkstra、Kruskal等图论算法实现参考。

qq_44750507的博客 728
上一篇: Idea中使用Git理论部分(瑞吉外卖)
下一篇: 面经:Redis
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值