算法
文章平均质量分 54
跟随左神学习算法
gltzlike
To be a better man !
展开
-
LeetCode 155. 包含min函数的栈
【问题】定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。1. 问题分析 核心思想是将每一次进入栈中的最小值保存下来。建立两个栈,一个数据 Data 栈,一个保存目前栈中最小值的 Min 栈。Data 栈用来接收用户传入的元素。Min 栈每次将传入元素与目前栈中最小值进行对比,如果小于等于,就压入栈中。故 Min 栈存在一个性质:栈顶到栈底,元素逐渐增大,栈顶元素为最小值。...原创 2021-08-27 20:39:22 · 79 阅读 · 0 评论 -
初级3 题目三 如何仅用队列结构实现栈结构?如何仅用栈结构实现队列结构?(LeetCode 232, 235)
1. 2h25min,队列存入数据,start end 如何变化的,这个不能纠结原创 2021-08-26 21:20:04 · 93 阅读 · 1 评论 -
初级8 题目零 介绍暴力递归和动态规划
1. 暴力递归1)把问题转化为规模缩小了的同类问题的子问题 2)有明确的不需要继续进行递归的条件(base case) 3)有当得到了子问题的结果之后的决策过程4)不记录每一个子问题的解2. 动态规划1)从暴力递归中来 2)将每一个子问题的解记录下来,避免重复计算 3)把暴力递归的过程,抽象成了状态表达 4)并且存在化简状态表达,使其更加简洁...原创 2021-06-24 17:16:19 · 69 阅读 · 2 评论 -
初级5 题目四 一致性哈希
1. 一致性哈希是用来服务器抗压设计的2. 经典的服务器抗压结构(负载均衡)如何设计? 假如有 3 台机器,要查一大堆字符串对应的 value 值,然后要负载均衡。做法就是每个字符串都计算一下哈希值,然后 %3,如果结果是 0 就放到第 0 号机器上,结果 1 就放到 1 号机器上,这样放下去,字符串在 3 台机器上的分布一定非常均衡。3. 上面这种结构的问题是什么?一旦加机器或者减机器,就需要把原先所有的数据重新计算哈希函数了,重新进行机器分配。而为了解决这个问题...原创 2021-06-08 08:11:03 · 166 阅读 · 0 评论 -
初级5 题目三 认识布隆过滤器
1. 布隆过滤器的使用需求是:查询一个东西是否在一个集合中。例如现在有 100 亿个url被列为黑名单,每次用户访问到该 url 时,返回 false。如果单纯地使用 HashSet,至少 6400 亿字节内存的损耗。而布隆过滤器可以极大程度降低这种内存需求,实现该功能。但布隆过滤器是存在短板的,失误率。但这种失误率不是被列为黑名单的 url 被判断不在黑名单中,而是不在黑名单的 url 被判断在了黑名单中。简单来说,就是宁可错杀三千,不放过一个。2. 在面试官问这个问题时,首先讲一下经典解法。然后问.原创 2021-06-02 07:57:17 · 132 阅读 · 0 评论 -
初级5 题目一 认识哈希函数和哈希表
1. 哈希函数的定义及性质: 1)哈希函数是函数,所以接收一个变量,返回一个值,接收的变量,其定义域理论上是无穷大,返回的值是哈希值,也就是每个变量都能生成对应的哈希值 2)哈希函数的值域是有穷的(哈希值有穷个),并非无穷大,哈希函数相当于把无穷大的范围中的所有变量映射到有穷范围中 3)对于同一个变量,哈希函数输出的哈希值不会发生变化,例如 f(1)=0,那么把 1 重新传入 f(x),f(1) 还是 0 4)不同变量对应的哈希值可能会相同,称...原创 2021-05-25 08:29:53 · 339 阅读 · 1 评论 -
初级2 题目三 堆排序
1. 建立堆,调整堆,堆排序建立堆,最有意思的是传入一个数组下标 index,找其父节点。正常情况下,找其父节点肯定要判断 index 是左孩子还是右孩子,左孩子的公式是 2*i+1(假设父节点下标为 i),右孩子公式为 2*i+2。但如果给定孩子下标,找其父节点,则左孩子找父节点的公式为 (index-1)/2,右孩子找父节点的公式为 (index-2)/2。#include <stdio.h>#include <time.h>#include <stdlib.原创 2021-03-28 11:29:55 · 142 阅读 · 0 评论 -
初级2 题目五 有关排序问题的补充
1. 归并排序的额外空间复杂度可以变成O(1),但是非常难,不需要掌握,可以搜“归并排序 内部缓存法” 2. 快速排序可以做到稳定性问题,但是非常难,不需要掌握, 可以搜“01 stable sort” 3. 有一道题目,是奇数放在数组左边,偶数放在数组右边,并要求原始的相对次序不变,且时间复杂度 O(n),空间复杂度 O(1)。这道题目的本质和快排 partition 的过程是一样的,都是 01 标准。一个数不是奇数就是偶数,找准一个位置,奇数的放在左边,偶数的放在右边;类比于快排的 ..原创 2021-03-24 08:24:51 · 91 阅读 · 0 评论 -
初级2 题目九 工程中的综合排序算法
1. 工程中,获取一个数组后,第一步是判断数组中元素的类型,如果是五种基础类型(int, double, short, float, char),则使用快排;如果是自己定义的类型(Student),需要按照字段来排序,则使用归并排序;如果数组长度很短,直接使用插排。原因在于插排的常数项极低,在样本量低于 60 (小样本)的情况下,虽然插排是 O(n^2),但是 O(n^2) 的劣势体现不出来,反而常数项极低的优势会体现出来。2. 看到 29min 了,回头继续...原创 2021-03-24 08:05:10 · 93 阅读 · 0 评论 -
初级1 题目三 插入排序
#include <stdio.h>#include <time.h>#include <stdlib.h>#define PLAYERS_COUNT 50// 交换数组中两个元素的值void Swap(int array[], int first, int second){ int temp; temp = array[first]; array[first] = array[second]; array[second] = temp;.原创 2021-03-21 16:34:05 · 253 阅读 · 0 评论 -
初级1 题目二 选择排序
#include <stdio.h>#include <time.h>#include <stdlib.h>#define PLAYERS_COUNT 50// 交换数组中两个元素的值void Swap(int array[], int first, int second){ int temp; temp = array[first]; array[first] = array[second]; array[second] = temp;.原创 2021-03-21 15:52:44 · 70 阅读 · 0 评论 -
初级1 题目二 冒泡排序
#include <stdio.h>#include <time.h>#include <stdlib.h>#define PLAYERS_COUNT 50// 交换数组中两个元素的值void Swap(int array[], int first, int second){ int temp; temp = array[first]; array[first] = array[second]; array[second] = temp;.原创 2021-03-21 10:10:43 · 72 阅读 · 0 评论 -
初级1 题目一 时间复杂度及示例
1. 首先谈谈什么是时间复杂度,时间复杂度为一个算法流程中,常数操作数量的指标(就是常数操作在算法里总共有多少次)。常用O(读作big O)来表示。具体来说,在常数操作数量的表达式中,只要高阶项,不要低阶项,也不要高阶项的系数,剩下的部分如果记为 f(N),那么时间复杂度为 O(f(N))。常数时间的操作:一个操作如果和数据量没有关系,每次都是固定时间内完成的操作,叫做常数操作。 评价一个算法流程的好坏,先看时间复杂度的指标,然后再分析不同数据样本下的实际运行时间,也就是常数项时间。..原创 2021-03-21 09:45:14 · 521 阅读 · 0 评论