LeetCode笔记
愚昧之山绝望之谷开悟之坡
人工智能智慧城市元宇宙pf,无无明亦无无明尽
展开
-
哈希表的理解
参考 https://zhuanlan.zhihu.com/p/95156642 做出笔记哈希表本质上是个数值,数组位置存放的是键值对,然后找到这个键值对,是通过里面存放的键值对的key值通过一个函数隐射后得到这个键值对的地址,然后得出来的。哈希冲突,得到的位置是同一个位置庆哥: 那必须滴啊 ,有什么方法呢?其实关于哈希冲突的解决办法有好几种嘞,但是我这里只介绍两种主要的方法,一个是开放寻址法,一个是拉链法。我觉得看图就足以说明问题了,这里所说的开放寻址法其实简单来说就是,既然位置被占了,那就另原创 2021-11-10 20:42:01 · 227 阅读 · 0 评论 -
玩个斗地主也能玩出算法?
那道题就是想怎么遍历,怎么把问题转换成遍历的问题就完事了1、当前元素v自成一派,「以自己开头」构成一个长度至少为 3 的序列。比如输入nums = [1,2,3,6,7,8],遍历到元素6时,它只能自己开头形成一个符合条件的子序列[6,7,8]。2、当前元素v接到已经存在的子序列后面。比如输入nums = [1,2,3,4,5],遍历到元素4时,它只能接到已经存在的子序列[1,2,3]后面。它没办法自成开头形成新的子序列,因为少了个6。但是,如果这两种情况都可以,应该如何选择?比如说,原创 2021-10-20 19:30:09 · 75 阅读 · 0 评论 -
如何穷举的思想很重要
一、要完成一件什么事,每个位置穷举过去就完成了二、这件事如何较好的完成,如何定义一些辅助变量协助完成原创 2021-10-18 19:46:59 · 73 阅读 · 0 评论 -
回溯算法牛逼!笔记
套框架,明确哪些是选择,怎么做选择不单单是链表很多数据都可以递归的操作,所谓的递归就是函数不断的嵌套调用自己而已,没啥两个递归,一个是针对一个通递归遍历所有的数第二个是,一个桶处理好了递归遍历下一个桶少量多次的原理回溯算法牛逼!...原创 2021-10-12 19:57:01 · 68 阅读 · 0 评论 -
完全二叉树的节点数复杂度
降低复杂度有各种讨论,可以加个判断,最终选择最小复杂度的做法分析明确数据结构的特点,以及他们之间的关系。原创 2021-09-28 19:16:04 · 160 阅读 · 0 评论 -
二叉树的题,就那几个框架,枯燥至极
主函数只有一个参数,实际需要多个参数才好操作,可以构造辅助函数来进行。无非就是各种数据结构之间的转换,熟悉各种数据结构的性质和操作。以列表作为过渡中专的数据结构PS:一般语境下,单单前序遍历结果是不能还原二叉树结构的,因为缺少空指针的信息,至少要得到前、中、后序遍历中的两种才能还原二叉树。但是这里的 node 列表包含空指针的信息,所以只使用 node 列表就可以还原二叉树。是因为空指针的确认问题考虑好当前节点要做什么,剩下的交给递归或者迭代,但是需要把迭代或者递归的环境搭建起来。...原创 2021-09-26 17:40:34 · 95 阅读 · 0 评论 -
套框架刷通二叉树|第一期
想清楚需求能否转换成一个节点做什么能,如果不能那就转换成两个节点或者多个节点写树相关的算法,简单说就是,先搞清楚当前root节点该做什么,然后根据函数定义递归调用子节点,递归调用会让孩子节点做相同的事情。回想刚才说的,二叉树的问题难点在于,如何把题目的要求细化成每个节点需要做的事情,但是如果只依赖一个节点的话,肯定是没办法连接「跨父节点」的两个相邻节点的。那么,我们的做法就是增加函数参数,一个节点做不到,我们就给他安排两个节点,「将每一层二叉树节点连接起来」可以细化成「将每两个相邻节点都连接起来」:原创 2021-09-12 20:00:46 · 106 阅读 · 0 评论 -
判断回文单链表,链表的遍历额二叉树的遍历
其实,借助二叉树后序遍历的思路,不需要显式反转原始链表也可以倒序遍历链表,下面来具体聊聊。对于二叉树的几种遍历方式,我们再熟悉不过了:void traverse(TreeNode root) { // 前序遍历代码 traverse(root.left); // 中序遍历代码 traverse(root.right); // 后序遍历代码}在 学习数据结构的框架思维 中说过,链表兼具递归结构,树结构不过是链表的衍生。那么,链表其实也可以有前序遍历和后序遍历原创 2021-09-11 08:51:34 · 83 阅读 · 0 评论 -
二叉堆,实现优先级队列/合并 k 个有序链表
这个代表还可以继续点击这个链接,进去看。输入的是当前节点的 索引,返回这个索引的父节点,左节点和右节点// 父节点的索引int parent(int root) {return root / 2;}// 左孩子的索引int left(int root) {return root * 2;}// 右孩子的索引int right(int root) {return root * 2 + 1;}非常清晰明了,每种数据结构都可以用一个类来定义,类里面有属性和相关的方法,刚好就是对应了,数.原创 2021-09-03 06:50:16 · 164 阅读 · 0 评论 -
二叉搜索树(BST)详解 先了解定义,性质,然后无非是遍历+访问都弄清楚
二叉搜索树(BST)详解 </h1> <div class="clear"></div> <div class="postBody"> <div id="cnblogs_post_body" class="blogpost-body blogpost-body-html">前言:平衡树的前置知识吧二叉搜索树的定义:二叉搜索树或者是...原创 2021-09-03 05:26:08 · 414 阅读 · 0 评论 -
递归和迭代
啥叫「自顶向下」?注意我们刚才画的递归树(或者说图),是从上向下延伸,都是从一个规模较大的原问题比如说f(20),向下逐渐分解规模,直到f(1)和f(2)触底,然后逐层返回答案,这就叫「自顶向下」。啥叫「自底向上」?反过来,我们直接从最底下,最简单,问题规模最小的f(1)和f(2)开始往上推,直到推到我们想要的答案f(20),这就是动态规划的思路,这也是为什么动态规划一般都脱离了递归,而是由循环迭代完成计算。自顶向下,就是递归,递归有分解到回溯 这个就是非线性遍历自底向上,就是迭代,无需分解 这原创 2021-08-22 22:41:14 · 148 阅读 · 0 评论 -
操作才会有时间复杂度和空间复杂度,操作无非就是增删改查
数组由于是紧凑连续存储,可以随机访问,通过索引快速找到对应元素,而且相对节约存储空间。但正因为连续存储,内存空间必须一次性分配够,所以说数组如果要扩容,需要重新分配一块更大的空间,再把数据全部复制过去,时间复杂度 O(N);而且你如果想在数组中间进行插入和删除,每次必须搬移后面的所有数据以保持连续,时间复杂度 O(N)。链表因为元素不连续,而是靠指针指向下一个元素的位置,所以不存在数组的扩容问题;如果知道某一元素的前驱和后驱,操作指针即可删除该元素或者插入新元素,时间复杂度 O(1)。但是正因为存储空间不原创 2021-08-18 19:26:28 · 94 阅读 · 0 评论 -
数据结构的-数组和链表,线性遍历和非线性遍历笔记
数组线性遍历链表线性和非线性遍历二叉树非线性遍历N叉树非线性遍历既然底层都是针对这几个数据结构的操作,那这几个数据结构无非就是操作之前需要先找到,找到无非就是线性遍历和非线性遍历,就是这么简单直接。...原创 2021-08-17 11:02:10 · 146 阅读 · 0 评论 -
数据结构宏观理解
数据结构的存储方式只有两种:数组(顺序存储)和链表(链式存储)。首先要明确的是,数据结构是工具,算法是通过合适的工具解决特定问题的方法。也就是说,学习算法之前,最起码得了解那些常用的数据结构,了解它们的特性和缺陷。针对不同的数据结构,有不同的存储方式,有不同的增删改查方式,查就是遍历,增删改就是访问,遍历就有线性和非线性,即非递归和递归,不同的操作,增删改查,对应不同的空间复杂度和时间复杂度。算法是通过合适的工具解决特定问题的方法。那工具就是数据结构,可见了解和掌握数据结构有多重要...原创 2021-08-16 10:22:16 · 119 阅读 · 0 评论 -
0数据结构和算法学习指南笔记
一数据结构的存储方式只有两种:数组(顺序存储)和链表(链式存储)。这句话怎么理解,不是还有散列表、栈、队列、堆、树、图等等各种数据结构吗?我们分析问题,一定要有递归的思想,自顶向下,从抽象到具体。你上来就列出这么多,那些都属于「上层建筑」,而数组和链表才是「结构基础」。因为那些多样化的数据结构,究其源头,都是在链表或者数组上的特殊操作,API 不同而已。比如说「队列」、「栈」这两种数据结构既可以使用链表也可以使用数组实现。用数组实现,就要处理扩容缩容的问题;用链表实现,没有这个问题,但需要更多的内存原创 2021-08-12 20:45:34 · 69 阅读 · 0 评论