算法与数据结构
十四说四十、
一只努力搬砖的985小硕
展开
-
数据结构与算法 -- LFU (有空会画一个完整的架构图)
请你为 最不经常使用(LFU)缓存算法设计并实现数据结构。它应该支持以下操作:get 和 put。get(key) - 如果键存在于缓存中,则获取键的值(总是正数),否则返回 -1。put(key, value) - 如果键已存在,则变更其值;如果键不存在,请插入键值对。当缓存达到其容量时,则应该在插入新项之前,使最不经常使用的项无效。在此问题中,当存在平局(即两个或更多个键具有相同使用频率)时,应该去除最久未使用的键。「项的使用次数」就是自插入该项以来对其调用 get 和 put 函数的次数之和原创 2020-09-05 02:41:35 · 317 阅读 · 0 评论 -
头条高频算法题总结(不断更新)
目录25. K 个一组翻转链表3. 无重复字符的最长子串102. 二叉树的层序遍历215. 数组中的第K个最大元素1. 调用系统实现好的api2. 用快速排序 partion方法3. 用堆排序25. K 个一组翻转链表class Solution { public ListNode reverseKGroup(ListNode head, int k) { if(head == null || head.next == null){ return head原创 2020-07-10 02:59:49 · 1604 阅读 · 0 评论 -
数据结构与算法 -- 内存置换算法LRU
运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。如果密钥存在,则更新其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。你是否可以在 O(1) 时间复杂度内完成这两种操作原创 2020-07-08 11:00:23 · 177 阅读 · 0 评论 -
数据结构与算法 -- 树形DP相关题型解题思路
目录一. 找出最大的平衡二叉树二.一. 找出最大的平衡二叉树列出一棵树所有的可能是平衡二叉树的可能性把这些信息简化 成为每一颗树都要返回的公共信息,跟左右子树没关写出递归。先给出递归退出条件,分析此时返回的信息是什么然后直接拿到所有的左右子树的信息开始依据拿到的左右子树信息开始封装自己的信息,然后向上返回。/** * 1. 首先找出可能性 * 2. 简化信息 * 3. 改成递归 */public class 最大平衡二叉树 { public static cla原创 2020-06-27 23:06:30 · 156 阅读 · 0 评论 -
数据结构与算法 -- Morris遍历算法
目录一. 传统做法与时间复杂度二. morris 时间复杂度 空间复杂度三. 算法流程四. 先序遍历五. 中序遍历六. 后序遍历一. 传统做法与时间复杂度遍历到树底后需要返回其上一个节点去遍历其右子树,所以传统是递归或者自己用个栈模拟递归操作。时间复杂度:O(N),空间复杂度:O(N)二. morris 时间复杂度 空间复杂度时间复杂度O(N) 空间复杂度:O(1)三. 算法流程当前节点记为cur,如果cur无左孩子,则cur向右移动,cur=cur.right如果cur有左孩子,则找到原创 2020-06-21 22:39:24 · 208 阅读 · 0 评论 -
数据结构与算法 --单调栈
目录一. 单调栈介绍二. 相关例题2.1 最大矩形2.2 柱状图中最大的矩形2.3 保卫方案一. 单调栈介绍是一种 栈, 对于出栈顺序递增叫单调递增栈,递减叫单调递减栈。二. 相关例题2.1 最大矩形leetcode 85. 最大矩形https://leetcode-cn.com/problems/maximal-rectangleclass Solution { public int maximalRectangle(char[][] matrix) { if原创 2020-06-21 12:09:04 · 149 阅读 · 0 评论 -
数据结构与算法 -- KMP算法
目录一.背景二. 思路三. 例题一.背景给两个字符串 s1 s2 ,求s2在s1中是否出现过,出现过的话,给出在s1中的第一个索引。二. 思路首先根据s2维护一个前缀后缀表,比如:abbac : [-1, 0, 0, 0, 1]然后在与s1进行比较,比如:miabbabbac 与 abbac首先有两个下标指针分别分i, j;s1[i]与s2[j]进行比较,不一样。判断j能不能跳到自己维护的前缀表里的前缀,此时next[j] =-1 说明此时j就是第一个字符,说明第一个字符都匹配不上,那么i原创 2020-05-29 11:14:28 · 223 阅读 · 0 评论 -
数据结构与算法 - 排序算法总结
冒泡排序思路:每次找到最大的放到最后public class BubbleSort { public static int[] bubble(int[] nums){ if(nums == null || nums.length = 2){ return nums; } for (int end = nums.length-1; end > 0; end-...原创 2019-11-28 20:30:56 · 180 阅读 · 0 评论 -
数据结构与算法 - 暴力递归到动态规划
public class Recursive { /** * 输入时一个N的正整数 * 返回是N的阶乘 * @return */ public static long process_NFactorial(int n){ if(n == 1){ return 1L; } ...原创 2019-11-12 21:21:25 · 156 阅读 · 0 评论 -
数据结构与算法 -分金条的最小花费
题目描述给定一个正数数组arr,arr的累加和代表金条的总长度,arr的每个数代表金条要分成的长度。规定长度为k的金条分成两块,费用为k个铜板。返回把金条分出arr中的每个数字需要的最小代价。[要求]时间复杂度为O(n \log n)O(nlogn),空间复杂度为O(n)O(n)思路直接使用贪心策略,这个为什么对,我们不需要自己去证明,只需要我们的策略是具有传递性的,那么怎么测试我们...原创 2019-11-12 00:17:51 · 1003 阅读 · 0 评论 -
数据结构与算法 - IPO
LeetCode 502 -IPO 题目描述:假设 力扣(LeetCode)即将开始其 IPO。为了以更高的价格将股票卖给风险投资公司,力扣 希望在 IPO 之前开展一些项目以增加其资本。 由于资源有限,它只能在 IPO 之前完成最多 k 个不同的项目。帮助 力扣 设计完成最多 k 个不同项目后得到最大总资本的方式。给定若干个项目。对于每个项目 i,它都有一个纯利润 Pi,并且需要最小的...原创 2019-11-12 00:10:46 · 822 阅读 · 0 评论 -
数据结构与算法 - 前缀树
什么是前缀树前缀树一般就是根据给的一个字符串构造一棵树,不同字符串继续构造树,也就是添加路径与节点前缀树的用途1 找有多少个字符串是以给定的字符串为前缀2 添加过多少个某个给定的字符串…怎么实现一个前缀树比如给一个“abc” 我们怎么构造一个前缀树呢?首先我们逻辑上把每个字符放在树的边上,节点存储很多的我们需要的数据项(比如说节点可以存储添加的时候字符走过多少次,依据需求自行添加...原创 2019-11-11 19:31:21 · 180 阅读 · 0 评论 -
数据结构与算法 - 并查集
用途1.判断两个元素所在的集合是否是一个集合2.把两个元素所在的集合连接起来(union)思路用两个Map 一个存储节点以及他的父节点,另一个存储当前节点以及这个节点对应的集合的元素个数实现第一个的时候有一个优化(路径压缩):在不断的查找父节点的时候,把每一个节点挂到整棵树的头节点上。在做两个集合连接的时候数据小的挂在数据大的后面。/** * 并查集的基础 * 1.判断两个集合...原创 2019-11-11 17:51:55 · 98 阅读 · 0 评论 -
数据结构与算法 - 一致性哈希
前言前面我们学过了哈希算法、哈希表、布隆过滤器,尤其是布隆过滤器,它的基本思想是需要一个大的位数组,然后把需要处理的数据进行哈希算法得到哈希值,然后模位数组的大小,然后置为1。缺点很明显,那就是当我们要进行复制的时候,我们就需要把之前所有的数据再次进行取模运算,这样很费时间,那么如何保证迁移的时候达到(1)数据的均匀分布,尤其是当我们的机器比较少的时候,哈希函数可能不会均匀的分布(2...原创 2019-11-09 13:27:32 · 165 阅读 · 1 评论 -
算法与数据结构 - 布隆过滤器
首先说布隆过滤器的干嘛的能够快速判断一个元素是否在一个集合中题目描述一个网站有 100 亿 url 存在一个黑名单中,每条 url 平均 64 字节。这个黑名单要怎么存?若此时随便输入一个 url,你如何快速判断该 url 是否在这个黑名单中?假如允许万分之一的概率出错(这个出错代表宁可错杀三千不可漏掉一个)思路1.用一个HashSet 但是我们计算一下需要的内存大小:100...原创 2019-11-08 16:56:41 · 170 阅读 · 0 评论 -
数据结构与算法 - 哈希函数与哈希表
哈希函数的特点:(1)理论上输入域是无穷大的,输出域是固定的。(2)哈希一般是16位的,每一位是0 ~ 9 + a ~ f 的随机数所以一共16的16次方种也就是2^64种(3)哈希函数输出的值会均匀分布。比如说输入域是0 ~ 98,输出域是0 ~ 2,我们输入99个数字,那么所有输入的值%3后,0、1、2后面基本都有33个数字。这里面是有大量的异或运算进行散列分布。(4)相同的值经过哈希...原创 2019-11-08 10:43:20 · 255 阅读 · 0 评论 -
数据结构与算法 - 计算完全二叉树的节点个数
计算完全二叉树的节点个数要求时间复杂度小于O(N)先说思路:直接看该节点的右子树的最左节点是否到达了树的底层(是否是最后一层),是的话那么该节点的左子树是满二叉树,可以直接求出其左子树的节点个数,这个可以直接用公式2^层数 - 1,由于该节点的右子树还是一颗完全二叉树,在对右子树进行递归操作否则的话,那么就说明右子树是一颗满二叉树,直接上公式计算,在对左子树做递归操作/**...原创 2019-11-07 22:30:41 · 416 阅读 · 0 评论 -
数据结构与算法 - 二叉树的序列化与反序列化
首先说下什么是序列化、持久化。其实就是写入到文件中,这样下次便于读取再次修改啥的。那么那些牛客什么的OJ网站是怎么判断我们写的代码输出的树的结构是否正确呢?他们其实就是利用了树的序列化,把树的这种结构转换为字符串,这样的话就可以方便比较。我们不能直接拿节点的内存地址来存储把,所以我们需要建立一套规则,使得二叉树可以与字符串一一对应,根据一个二叉树可以唯一的得到一个字符串,根据一个字符串也可以唯...原创 2019-11-07 22:20:26 · 228 阅读 · 0 评论 -
数据结构与算法 - 如何判断二叉搜索树 完全二叉树?
1.二叉搜索树定义:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值思路是:看其二叉树的中序遍历是否是按照数值升序上升的首先看一下树的定义public static class Node{ public int value; public Node left; ...原创 2019-11-07 22:05:49 · 186 阅读 · 0 评论 -
数据结构与算法 - 如何判断平衡二叉树?
1.判断是否是平衡二叉树定义:每个结点的左子树和右子树的高度差至多等于1树形DP 在树上做动态规划思路就是捋清楚问题出现的情况,然后利用递归大方向解题,由于需要高度以及返回值类型,所以我们需要自己封装一个返回值类型。(1)看左树是否是平衡二叉树(2)再看右树是否是平衡二叉树(3)然后是整体的高度差 看是否整体是一个平衡二叉树public class IsBalancedTr...原创 2019-11-07 21:58:59 · 266 阅读 · 0 评论 -
数据结构与算法 - 二叉树的后继节点查找
题目描述:给一个二叉树的随机节点,查找这个节点的后继节点前驱节点:对一棵二叉树进行中序遍历,遍历后的顺序,当前节点的前一个节点为该节点的前驱节点;后继节点:对一棵二叉树进行中序遍历,遍历后的顺序,当前节点的后一个节点为该节点的后继节点;思路一:直接遍历全部的二叉树,根据顺序直接得出结果,但是时间复杂度是O(N)思路二:首先判断这个节点是否有右子树,有的话直接找到这个右子树的最左的...原创 2019-11-06 20:39:05 · 289 阅读 · 0 评论 -
数据结构与算法 -- 二叉树的 递归非递归 先序中序后序遍历 层次遍历
二叉树的定义:public static class Node{ public int value; public Node left; public Node right; public Node(int value){ this.value = value; } }二叉...原创 2019-10-25 21:38:09 · 192 阅读 · 0 评论 -
数据结构与算法基础 -- 求两个链表的相交的第一个节点(超全解法,包含主函数测试)
总体思路1.首先是判断两个链表是否有环,有的话返回其环的入口 没有返回null2.一共两种情况 (1)两个无环链表相交(2)两个有环链表相交 (至于为啥没有一个有环一个没环的相交 因为我们的是单链表)其中两个有环链表相交又分为三种情况:先总结下涉及到的小知识点:(1)求单链表是否有环 如果有环,返回环入口的第一个节点否则返回null细节思路:利用快慢指针做,快的一次两步慢...原创 2019-10-23 22:40:18 · 254 阅读 · 0 评论 -
数据结构与算法基础 -- 链表的Partition
实现链表的Partition过程大于target 放右边 等于放中间 小于放左边@author zhx方法一:用一个数组实现。该方法不保证稳定性并且空间复杂度O(N) 适合笔试机试首先是建立一个与链表同样大小的数组,然后再把所有的节点存储进去设置 三个变量small —从-1开始,代表小于target的值 依次++big —从最后开始 – 代表大于的值index 代表当前...原创 2019-10-22 22:11:22 · 223 阅读 · 0 评论 -
数据结构与算法基础 -- 回文链表(非常全的解法)
题目描述 请判断一个链表是否为回文链表。示例1:输入: 1->2 输出: false 示例2:输入: 1->2->2->1 输出: true 进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?首先是节点的定义: public static class Node{ public int value; publ...原创 2019-10-20 19:58:24 · 188 阅读 · 0 评论 -
数据结构与算法基础 -- 猫狗队列
实现一种猫狗队列的结构,要求如下:add()把dog或者cat类的实例放入队列中pollDog()把狗队列的最先进入的弹粗来pollCat()把猫队列的最先进入的弹粗来isEmpty() 检查队列中是否还有dog或者cat的实例isCatEmpty检查队列中是否还有cat的实例isDogEmpty检查队列中是否还有dog的实例核心思想就是存储猫狗的队列里面不直接存储猫狗的实例而是...原创 2019-10-17 12:06:22 · 184 阅读 · 0 评论 -
数据结构与算法基础 -- 最小栈
请实现一个基本栈 有一个getMin()函数 可以实现在O(1)时间内查询出栈内最小的值思路 用两个栈 一个就是存储数据 一个存储存储最小的值 这样需要getMin()的时候直接从辅助栈中pop()就好了/** * 请实现一个基本栈 有一个getMin()函数 可以实现在O(1)时间内查询出栈内最小的值 * @author zhx */public class GetMin...原创 2019-10-16 16:19:05 · 169 阅读 · 0 评论 -
数据结构与算法基础 --两个栈实现队列或者用俩个队列实现栈
* 用两个队列实现栈 * 思路就是: * 找两个队列,一个data队列用来存储数据,一个help队列是辅助 * 在push的时候 直接插入到data中,在poll或者peek的时候先把data队列的前n-1个元素push到help中 * 这时候data剩下的一个就是我们需要的,满足栈先进后出的元素 * 然后我们再把help变为空 这时候只需要把data 与help的引用互相交换即可,...原创 2019-10-16 16:15:20 · 133 阅读 · 0 评论 -
数据结构与算法基础 -- 数组实现固定大小的栈与队列
数组实现固定大小的栈的思路就是:(1) 用一个index变量 代表要插入的位置,随着插入的个数增加(2)每次pop的时候只需要把–index位置的元素拿出来就实现了先进后出的栈结构数组实现固定大小的队列(1)用三个变量 start代表要pop出去的, end代表push进去的, size代表整个队列的元素的个数,用这个来让start 与 end 解耦。(2)业务就是:push 要...原创 2019-10-16 16:11:29 · 161 阅读 · 0 评论 -
leetcode -- 146. LRU缓存机制
运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数...原创 2019-10-15 21:41:18 · 121 阅读 · 0 评论 -
数据结构与算法-大顶堆
我们先介绍下几个定义:完全二叉树:从左到右节点依次补齐满二叉树:除了叶子节点外其他层每个节点都有2个节点对于完全二叉树底层可以用数组表示:对于某个下标 i :(1) 2 * i + 1--------左(2)2 * i + 2--------右(3)( i - 1 ) / 2 ------父节点大根堆:首先是一棵完全二叉树,定义是任何一棵子树的最大值是子树头部小根堆:...原创 2019-10-09 15:49:58 · 148 阅读 · 0 评论