leetcode重点题目分类别记录(一)数据结构类

news/2024/4/27 4:48:03/文章来源:https://blog.csdn.net/baiduwaimai/article/details/129104874

算法题分类别记录

  • 数组
    • 排序
      • 归并排序
        • 合并两有序数组
        • 归并排序
      • 快速排序
        • 荷兰旗问题
        • 快速排序
      • 堆排序
      • 基数排序
    • 滑动窗口/双指针
      • N数之和
      • 四数相加
  • 链表
    • 环形链表
    • 重排链表
    • LRU缓存
  • 栈与队列
    • 栈实现队列/队列实现栈
    • 最小栈/最小队列
    • 单调队列
    • 单调栈
  • 哈希表
  • 字符串
    • 字符串处理
    • 字符串匹配KMP
    • 子串
  • 二叉树
    • 二叉树的遍历方式
      • 递归法
      • 迭代法
        • 先序
        • 后序
        • 中序
    • 二叉树的最近公共祖先
  • 回溯
  • 动态规划
    • 背包
      • 01背包
      • 完全背包
      • 购买股票
      • 打家劫舍
      • 子序列/子串问题
  • 贪心算法

数组

排序

归并排序

合并两有序数组

合并两个升序有序数组

这里借助了赋值空间help数组,是归并排序中使用的手段,因此归并排序的空间复杂度为O(n),此外归并时,可以保证稳定性,主要体现在当元素相等时,直接赋值左边数组元素。

vector<int> mergeTwoArr(vector<int> &nums1, vector<int> &nums2) {int m = nums1.size(), n = nums2.size();vector<int> help(m + n, 0);int i = 0, j = 0, k =  0;while (i < m && j < n) help[k++] = nums1[i] > nums2[j] ? nums2[j++] : nums1[i++];while (i < m) help[k++] = nums1[i++];while (j < n) help[k++] = nums2[j++];nums1.resize(help.size());copy(help.begin(), help.end(), nums1.begin());
}

归并排序

void merge(vector<int> &nums, int left, int mid, int right) {vector<int> help();help.resize(right - left + 1);int p1 = left, p2 = mid + 1, index = 0;while (p1 <= mid && p2 <= right) help[index++] = nums[p2] < nums[p1] ? nums[p2++] : nums[p1++];while (p1 <= mid) help[index++] = nums[p1++];while (p2 <= right) help[index++] = nums[p2++];copy(help.begin(), help.end(), nums.begin() + left);
}void mergeRecur(vector<int> &nums, int left, int right) {if (left < right) {int mid = left + ((right - left) >> 1);mergeRecur(nums, left, mid);mergeRecur(nums, mid + 1, right);merge(nums, left, mid, right);}	
}void mergeSort(vector<int> &nums) {mergeRecur(nums, 0, nums.size() - 1);
}

快速排序

荷兰旗问题

2161. 根据给定数字划分数组

快速排序

堆排序

基数排序

滑动窗口/双指针

N数之和

15三数之和
18四数之和

四数相加

454. 四数相加 II

链表

环形链表

142环形链表
1、快慢指针法, 如果无环一定快指针先到末尾
2、如果有环,快慢指针在某个时刻相等
3、如果相等,将快指针调回头部,快慢指针都一次一步,两者在入口相遇

ListNode* detectCircle(ListNode* head) {ListNode *slow = head, *fast = head;// 如果无环一定快指针先到末尾while (fast && fast->next) {// 快指针一次两步,慢指针一次一步,如果有环,某个时刻,快指针与慢指针相等slow = slow->next;fast = fast->next->next;// 如果相等,将快指针调回头部,快慢指针都一次一步,两者在入口相遇if (slow == fast) {fast = head;while (slow != fast) {slow = slow->next;fast = fast->next;}return slow;}}return nullptr;
}

重排链表

143重排链表
反转后半条链表,然后重排。
注意利用快慢指针获取链表中间靠左的位置。

    ListNode* reverseList(ListNode* head) {ListNode* cur = head, *pre = nullptr;while (cur) {ListNode* next = cur->next;cur->next = pre;pre = cur;cur = next;}return pre;}void reorderList(ListNode* head) {ListNode* slow = head, *fast = head;// 注意:快慢指针遍历,条件为 while(fast && fast->next),假定节点长为偶数个,最终慢指针停在中间靠右位置// 而条件为 while (fast->next && fast->next->next) 慢指针最终停在中间靠左位置。假设节点长为奇数,都停中间while (fast->next && fast->next->next) {slow = slow->next;fast = fast->next->next;}ListNode* l1 = head, *l2 = slow->next;// 前后半条链表断开,返回后半条链表slow->next = nullptr; l2 = reverseList(l2);// 奇数时,前半条比后半条多一个节点,偶数时长度相同// 将l2的节点每间隔一个串到l1上while (l2) {ListNode* next1 = l1->next, *next2 = l2->next;l1->next = l2;l2->next = next1;l1 = next1;l2 = next2;}}

LRU缓存

146LRU缓存
需要构建一种结构,支持随机访问缓存内容,而又便于删除过期缓存和添加新的缓存。
因此构建如下图所示的由双向链表与哈希表组成的特殊数据结构:
在这里插入图片描述

编写时的注意点:
1、头尾使用虚拟伪节点,不计入哈希表结构
2、push新的缓存时,假如哈希表中已有key,还需要将key对应的value更新为最新的value,随后再添加到链表头部
3、先编写在头部添加节点addToHead()和删除某个位置的节点 remove()这样的基础函数。据此构建移动到头部的函数moveToHead
4、基础的remove函数,仅仅是在链表的某个位置将该节点脱离下来,并没有真正删除节点的指针,因此当容量满了,需要删除过期节点时,需要先将尾结点获取到,随后在链表中remove它,然后再在哈希中erase,最后执行delete操作。

class HashLinkedNode {
public:    int key, val;HashLinkedNode *pre, *next;HashLinkedNode() : key(0), val(0), pre(nullptr), next(nullptr) {}HashLinkedNode(int _key, int _val) : key(_key), val(_val), pre(nullptr), next(nullptr) {}
};class LRUCache {
public:LRUCache(int capacity) : capacity(capacity), size(0) {head = new HashLinkedNode();tail = new HashLinkedNode();head->next = tail;tail->pre = head;}int get(int key) {if (mp.count(key)) {HashLinkedNode* node = mp[key];moveToHead(node);return node->val;}return -1;}void put(int key, int value) {if (mp.count(key)) {  // 如果表中已经有key,直接修改key对应的val值并移动到队列头HashLinkedNode* node = mp[key];node->val = value;moveToHead(node);} else {HashLinkedNode* node = new HashLinkedNode(key, value);mp.insert({key, node});addToHead(node);++size;if (size > capacity) {HashLinkedNode* outNode = removedTail(); mp.erase(outNode->key);delete outNode;--size;}}}void addToHead(HashLinkedNode* node) {node->next = head->next;head->next->pre = node;head->next = node;node->pre = head;}void removedNode(HashLinkedNode* node) {node->pre->next = node->next;node->next->pre = node->pre;}void moveToHead(HashLinkedNode* node) {removedNode(node);addToHead(node);}HashLinkedNode* removedTail() {HashLinkedNode* node = tail->pre;removedNode(node);return node;}private:HashLinkedNode *head, *tail;unordered_map<int, HashLinkedNode*> mp;int size, capacity;
};

栈与队列

栈实现队列/队列实现栈

最小栈/最小队列

单调队列

单调栈

哈希表

字符串

字符串处理

字符串匹配KMP

注意pre已经是前一个位置处的最长的前缀和后缀匹配长度,当不匹配且pre没有后退到0时,则pre后撤 pre = ans[pre];

vector<int> getNext(string str) {if (str.size() == 1) return {-1};vector<int> ans(str.size(), 0);ans[0] = -1;ans[1] = 0;// 从i为2开始, pre是ans[i - 1], 即前一个位置最长公共前后缀int i = 2, pre = 0;while (i < str.size()) {if (str[i- 1] == str[pre]) ans[i++] = ++pre;else if (pre > 0) pre = ans[pre];else ans[i++] = 0;}return ans;
}int strStr(string haystack, string needle) {int m = haystack.size(), n = needle.size();if (m < n) return -1;vector<int> next = getNext(needle);int p1 = 0, p2 = 0;while (p1 < m && p2 < n) {if (haystack[p1] == needle[p2]) {++p1; ++p2;}else if (p2 == 0) ++p1;else p2 = next[p2];}return p2 == n ? p1 - p2 : -1;
}

子串

二叉树

二叉树的遍历方式

递归法

迭代法

先序

后序

中序

二叉树的最近公共祖先

235. 二叉搜索树的最近公共祖先
236. 二叉树的最近公共祖先

回溯

动态规划

背包

01背包

完全背包

购买股票

打家劫舍

子序列/子串问题

贪心算法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_72787.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Dart的安装及环境变量配置

本文介绍dart的安装步骤及环境变量配置&#xff0c;以及如何在vscode中进行开发环境配置。一、dart的安装访问dart官网https://dart.cn/&#xff0c;点击网站右上角的获取DART SDK进行下载页面。如下图&#xff0c;选择下载SDK的zip压缩文件。根据自己的操作系统情况选择合适版…

吉卜力风格水彩画怎么画?

著名的水彩艺术家陈坚曾说&#xff1a;“水彩是用水润调和形成的饱和度极高的艺术画面&#xff0c;在纸上晕染的画面面积、强度等具有许多随意性&#xff0c;天空的颜色乌云密布&#xff0c;都是很随意的&#xff0c;难以模仿。” 是的&#xff0c;水彩画的妙处就在于不确定的…

apk中代码执行adb指令实现

背景&#xff1a;想要在android apk中直接使用adb指令&#xff0c;从而不需要把手机通过数据线方式连接到电脑&#xff0c;在电脑端执行adb指令。 一、权限相关 想要在apk代码中执行adb命令&#xff0c;涉及到执行权限。 首先手机需要有root权限。其次就算手机已经root了&…

(18)目标检测算法之数据集标签格式转换:json2txt、xml2txt

目标检测算法之数据集标签格式转换&#xff1a;json2txt、xml2txt 目标检测最常见的模型&#xff1a;YOLO&#xff0c;常见的几种标注方式&#xff1a;矩形框、旋转矩形框、实例分割中的多边形标注等类型&#xff0c;根据其标注标签&#xff0c;目标检测主要有以下两种转换方式…

Word中批量调整图片大小

当一个文档中图片较多&#xff0c;又需要调整图片大小时&#xff0c;这时可以通过“宏”执行代码来批量调整。打开一个Word文档。“AltF8"键打开宏。设置“宏名”&#xff0c;并单击“创建”。创建完宏后&#xff0c;将进入Visual Basic 编辑器界面。在代码编辑区全选&…

【面试题】TCP如何保证传输可靠性?TCP流量控制实现、拥塞控制、ARQ协议、停止等待ARQ、连续ARQ

文章目录1. TCP 如何保证传输的可靠性&#xff1f;2.TCP 如何实现流量控制&#xff1f;3.TCP 的拥塞控制是怎么实现的&#xff1f;3.ARQ 协议了解吗?4.停止等待 ARQ 协议5.连续 ARQ 协议1. TCP 如何保证传输的可靠性&#xff1f; 基于数据块传输 &#xff1a;应用数据被分割成…

前端编译、JIT编译、AOT编译

一、前端编译&#xff1a;java设计之初就是强调跨平台&#xff0c;通过javac将源文件编译成于平台无关的class文件&#xff0c; 它定义了执行 Java 程序所需的所有信息&#xff08;许多Java"语法糖"&#xff0c;是在这个阶段完成的&#xff0c;不依赖虚拟机&#xff…

01-MySQL基础-简介安装navicat使用SQL(DDL、DML、(DCL)、DML)

文章目录MySQL基础1&#xff0c;数据库相关概念1.1 数据库1.2 数据库管理系统1.3 常见的数据库管理系统1.4 SQL2&#xff0c;MySQL2.1~2.4 mysql安装2.5 MySQL数据模型3&#xff0c;SQL概述3.1 SQL简介3.2 通用语法3.3 SQL分类4&#xff0c;DDL:操作数据库4.1 查询4.2 创建数据…

Java笔记026-集合/数组、Collection接口、ArrayList、Vector、LinkedList

集合集合的理解和好处保存多个数据使用的是数组&#xff0c;分析数组的弊端数组1、长度开始必须指定&#xff0c;而且一旦指定&#xff0c;不能更改2、保存的必须为同一类型的元素3、使用数组进行增加/删除元素的示意代码-比较麻烦Person数组扩容示意代码Person[] pers new Pe…

手把手搭建springboot项目05-springboot整合Redis及其业务场景

目录前言一、食用步骤1.1 安装步骤1.1.1 客户端安装1.2 添加依赖1.3 修改配置1.4 项目使用1.5 序列化二、应用场景2.1 缓存2.2.分布式锁2.2.1 redis实现2.2.2 使用Redisson 作为分布式锁2.3 全局ID、计数器、限流2.4 购物车2.5 消息队列 (List)2.6 点赞、签到、打卡 (Set)2.7 筛…

Liunx服务器安装SVN

一、下载svn安装包链接&#xff1a;https://pan.baidu.com/s/1gkS0tef2kQP6nvXOS64hUw 提取码&#xff1a;cyuw二、SVN安装部署通过sftp将文件拉取到目的主机路径&#xff1a;/usr/package 跳转文件路径: cd /usr/package 执行解压命令:tar -zxvf subversion-1.14.2.tar.gz 执行…

idea启动报错If you already have a 64-bit JDK installed, define a JAVA HOME variable

IDEA启动报错&#xff0c;如下图所示&#xff1a; 解决方法&#xff1a; 1.根据以下路径找到文件idea64.exe.vmoptions &#xff0c;路径如下图所示&#xff1a; C:\Users\Thinkpad\AppData\Roaming\JetBrains\IntelliJIdea2020.3\idea64.exe.vmoptions 其中Thinkpad是电脑的…

j-vxe-table 下拉搜索选择框数据加载过多导致前端崩溃问题

Jeeg-boot j-vxe-table 下拉搜索选择框数据加载过多导致前端崩溃问题 最近用到了Jeeg-boot j-vxe-table的组件&#xff0c;这组件时真J8难用&#xff0c;还好多BUG&#xff0c;想用个slot插槽也用不了&#xff0c;好像官方写了个基础就没怎么管了。&#x1f611; 问题&#xf…

JavaEE-初识Servlet

目录Servlet 是什么?完成一个servlet程序1.创建一个maven项目2.引入依赖3.创建目录4.编写Servlet代码5.打包6.部署7.验证程序第三方工具简化Servlet 是什么? Servlet 是一种实现动态页面的技术. 是一组 Tomcat 提供给程序猿的 API, 帮助程序猿简单高效的开发一个 web app. …

阅读笔记7——Focal Loss

一、提出背景 当前一阶的物体检测算法&#xff0c;如SSD和YOLO等虽然实现了实时的速度&#xff0c;但精度始终无法与两阶的Faster RCNN相比。是什么阻碍了一阶算法的高精度呢&#xff1f;何凯明等人将其归咎于正、负样本的不平衡&#xff0c;并基于此提出了新的损失函数Focal L…

支持向量机SVM详细原理,Libsvm工具箱详解,svm参数说明,svm应用实例,神经网络1000案例之15

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 Libsvm工具箱详解 简介 参数说明 易错及常见问题 SVM应用实例&#xff0c;基于SVM的股票价格预测 支持向量机SVM的详细原理 SVM的定义 支持向量机&#xff08;support vector machines, SVM&#xff09;是一种二分类模型&a…

Linux文件系统操作与磁盘管理

查看磁盘和目录的容量 使用 df 命令查看磁盘的容量 df在实验楼的环境中你将看到如下的输出内容&#xff1a; 但在实际的物理主机上会更像这样&#xff1a; 物理主机上的 /dev/sda2 是对应着主机硬盘的分区&#xff0c;后面的数字表示分区号&#xff0c;数字前面的字母 a 表示…

《JeecgBoot系列》 如何设计表单实现“下拉组件二级联动“ ? 以省市二级联动为例

《JeecgBoot系列》 如何设计表单实现"下拉组件二级联动" ? 以省市二级联动为例 一、准备字典表 1.1 创建字典表 CREATE TABLE sys_link_table ( id int NULL, pid int NULL, name varchar(64) null );1.2 准备数据 idpidname1全国21浙江省32杭州市42宁波市51江苏…

投出1000份简历,苦于软件测试没有项目经验,全部石沉大海,辞职5个月,我失业了......

想要找一份高薪的软件测试工作&#xff0c;简历项目必不可少&#xff08;即使是应届生&#xff0c;你也要写上实习项目&#xff09;。所以很多自学的朋友找工作时会碰到一个令人颇感绝望的拦路虎&#xff1a;个人并没有实际的项目工作经验怎么办&#xff1f; 怎么办&#xff1f…

Kotlin新手教程九(协程)

一、协程 协程从Kotlin1.3开始引入&#xff0c;本质上协程就是轻量级的线程。协程的基本功能点有&#xff1a; 轻量&#xff1a;可以在单个线程上运行多个协程&#xff0c;因为协程支持挂起&#xff0c;不会使正在运行协程的线程阻塞。挂起比阻塞节省内存&#xff0c;且支持多…