数据结构与算法
文章平均质量分 72
Jacyn_小小欣
好好学习,找到实习,顺利毕业,早日退休!冲冲冲!
展开
-
子串,子数组问题---滑动窗口
/* 滑动窗口算法框架 */void slidingWindow(string s, string t) { unordered_map<char, int> need, window; for (char c : t) need[c]++; int left = 0, right = 0; int valid = 0; while (right < s.size()) { // c 是将移入窗口的字符 char原创 2021-07-15 15:27:40 · 178 阅读 · 0 评论 -
数据结构与算法专题汇总(十)二叉树基础
1. 概念父节点,子节点,兄弟节点根节点,叶子节点高度:从下往上数的高度,即节点到叶子节点的最长路径深度:从上往下数,看看有多深。即根节点到该结点经历的边数层数:深度+1,即从1开始树在第几层树的高度:根节点的高度二叉树,满二叉树,完全二叉树** 存储 **链式存储class BiTreeNode{ def __init__(self,data,left,right): self.data = data self.left = left self.right = righ原创 2021-05-06 15:23:53 · 184 阅读 · 0 评论 -
数据结构与算法专题汇总(九)散列表,冲突避免,分布式系统中运用,一致性哈希算法
数据按照下标随机访问数据的特性键值+散列函数+散列值散列函数得到的散列值是非负整数key1 == key2 : hash(key1)==hash(key2)key1 != key2: hash(key1) != hash(key2)标题散列冲突:1.开放寻址法线性探测某个数据经过散列后,发现存储位置已经被占用,从当前位置往后找,直至找到空闲位置。删除时:不能直接删除,否则可能导致之后的数据查找截断。可以把该位置标为deleted缺点:随着数据增多,复杂度可能退化为O(n)优化:二原创 2021-04-25 18:22:53 · 324 阅读 · 0 评论 -
数据结构与算法专题汇总(八)二分查找,查找元素第一个位置和最后一个位置,搜索旋转排序数组,跳表
非递归实现def bsearch(nums,n,value): low = 0 high = n-1 while low<=high: mid = low+(high-low)/2 if nums[mid]==value: return mid elif nums[mid]<value: low = mid+1 else: high = mid-1 return -1注意:**循环退出条件 low <= high **mid取值 (lo原创 2021-04-16 00:46:21 · 221 阅读 · 0 评论 -
数据结构与算法专题汇总(五)堆排序
堆1. 什么是堆一棵完全二叉树:除了最后一层,其他层的节点个数都是满的堆中每一个节点的值都必须大于等于(小于等于)其子树中每个节点的值2.如何实现一个堆完全二叉树:适合用数组存储数组中下标为i的节点的左子节点,是下标为2i的节点;右子节点是下标为2i+1的节点,父节点是i/2的节点。往堆中插入一个元素删除堆顶元素把最后一个节点放到堆顶,再从上往下进行堆化插入删除都是O(logn)3.如何基于堆实现排序建堆思路一:在堆中插入一个元素的思路思路二:从后往前处理数据,每原创 2020-09-20 23:49:50 · 192 阅读 · 0 评论 -
数据结构与算法专题汇总(五)排序,桶排序,计数排序,基数排序
1.桶排序将数据分到几个有序的痛刘辩,每个桶里的数据用快排,之后再把每个桶里的数据依次取出。要求:1.排序的数据很容易划分为m个桶,这些桶之间有着大小顺序2.数据在各个桶中分布较均匀3.适合用于外部排序:数据存储在外部磁盘中,数量比较大,内存有限,无法将数据全部加载到内存举例:比如说我们有 10GB 的订单数据,我们希望按订单金额(假设金额都是正整数)进行排序,但是我们的内存有限,只有几百 MB,没办法一次性把 10GB 的数据都加载到内存中。这个时候该怎么办呢?1.扫描一遍文件,看订单金原创 2020-09-20 20:42:39 · 174 阅读 · 0 评论 -
数据结构与算法专题汇总(七)队列的leetcode题:滑动窗口最大值,二叉树平均值,栈实现队列,队列实现栈
1.滑动窗口最大值给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。解题思路:用双端队列解决,窗口移动时,将要进入窗口的数字若是比队列尾的数字大,则当前数字将会是这个窗口下的最大数字,队列尾的数字可以移除;若小,则直接加入队列尾,因为它可能比之后的数字都大,在后面的便利中会成为最大值。当窗口移动到有k个数字后,就可以将队列头push到res里边,作为当前窗口下的最大数字。原创 2020-09-15 22:43:46 · 180 阅读 · 0 评论 -
数据结构与算法专题汇总(七)队列的python实现,循环队列判满,阻塞队列和并发队列,线程池
1.队列先进先出:入队enqueue(),出队dequeue()同栈一样,是一种操作受限的线性表数据结构数组实现队列:顺序队列链表实现队列:链式队列//python顺序队列class queue: def __init__(self): self.queue = [] def enqueue(self, item): self.queue.append(item) def dequeue(self): return se原创 2020-09-13 18:09:59 · 555 阅读 · 0 评论 -
数据结构与算法专题汇总(六)栈的应用和代码实现:最小栈,比较含退格的字符串,下一个更大元素
1.最小栈设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。解题:两个栈,一个栈存储数字,一个栈存储当前的最小数,在进行push和pop时分别对两个栈进行操作class MinStack: def __init__(self): """ initialize yo原创 2020-09-13 16:27:07 · 166 阅读 · 0 评论 -
数据结构与算法专题汇总(六)栈,python实现栈,栈的应用和代码实现:函数调用,表达式求值,括号匹配,浏览器前进与后退
1.栈操作受限的线性表,只能在一端插入和删除数据。数组实现栈:顺序栈链表实现栈:链式栈#python实现顺序栈class ArrayStack: def __init__(self,n): self.stack = [] self.limit = n self.count = 0 def push(self,item): if self.count == self.limit: return原创 2020-09-13 15:22:51 · 377 阅读 · 0 评论 -
数据结构与算法专题汇总(五)排序,冒泡排序,插入排序,选择排序,最小k个数,面试题:n组数据找最小m个数
一. 常见排序算法排比较序算法时间复杂度是否基于比较冒泡,插入,选择O(n^2)✅快排,归并O(nlogn)✅桶,计数,基数O(n)❌分析排序算法执行效率:比较次数,交换次数内存消耗:原地排序??稳定性二. 常见算法原理及实现1.冒泡排序每一轮比较选出最大值放置在排序位置上当一轮不出现交换的时候,表示数据已排序完毕,所以可设置一个哨兵,判读当前本轮是否有交换的情况。def bubbleSort(numbers,length):原创 2020-08-23 17:29:21 · 390 阅读 · 0 评论 -
数据结构与算法专题汇总(四)递归,台阶问题,递归防止栈溢出,利用散列表避免重复计算,
1.递归条件一个问题的解可以分为子问题的解分解后的子问题,与原问题的解题思路一致,数据规模不一致存在递归终止条件写出递归公式和终止条件!!!写出递归公式和终止条件!!!写出递归公式和终止条件!!!2.举例台阶问题:假如这里有 n 个台阶,每次你可以跨 1 个台阶或者 2 个台阶,请问走这 n 个台阶有多少种走法?如果有 7 个台阶,你可以 2,2,2,1 这样子上去,也可以 1,2,1,1,2 这样子上去,总之走法有很多,那如何用编程求得总共有多少种走法呢?解答:可以根据第一步的走法原创 2020-08-23 11:02:49 · 296 阅读 · 0 评论 -
数据结构与算法专题汇总(三)链表相关leetcode题目(链表反转,链表合并,快慢指针的用法:找中间结点,环的检测,回文判断,删除倒数第n个结点)
1.链表反转链表反转就是将结点的pre赋值给当前结点的next的过程,其中注意不要丢失指针class ListNode: def __init__(self,x): self.val = x self.next = Noneclass Solution: def reverseList(self, head: ListNode) -> ListNode: cur = head pre = None while(cur):原创 2020-08-11 23:29:26 · 216 阅读 · 0 评论 -
数据结构与算法专题汇总(三)链表(时间复杂度比较,链表vs数组,LRU应用,链表相关题目技巧)
链表通过指针将一组零碎的内存块串联起来1.单链表插入,删除:O(1)不支持随机访问2.循环链表3.双向链表空间换时间找前驱结点O(1)4.时间复杂度比较删除结点中“值等于某定值”的结点:查找:O(n),删除O(1)删除结点中指定结点指向的结点单向:O(n) 找前驱双向:O(1)5.数组vs链表操作数组链表插入/删除O(n)O(1)随机访问O(1)O(n)数组,连续存储空间,CPU缓存机制预读数据效率高;链表CPU缓存不友好原创 2020-08-11 17:24:50 · 460 阅读 · 0 评论 -
数据结构与算法专题汇总(二)数组(连续空间,提高删除效率,JVM垃圾回收应用)
1.特性1.线性表数据结构2.一组连续的存储空间3.一般存储具有相同类型的数据数据适合查找其实不是正确的说法,因为数组查找用二分查找时间复杂度也是o(logn),准确的说法应该是数据支持随机访问线性表:数据,链表,栈,队列非线性表:树,图连续的存储空间:数组为什么从0开始?连续的存储空间是指,数组的数据存储在内存中是连续的a[I]_address = base_address + I *data_type_size其中数据的下标i就为偏移地址,这也是为什么地址从0开始的原因数组越界对原创 2020-08-11 16:46:17 · 299 阅读 · 0 评论 -
数据结构与算法专题汇总(一)复杂度分析(均摊时间复杂度)
1.基础介绍1.数据结构一组数据的存储结构2.算法操作数据的一组方法2.复杂度分析2.1.时间复杂度多项式量阶复杂度非多项式量阶复杂度常量阶 O(1)指数阶 O(2^n)对数阶 O(logn)阶乘阶 O(n!)线性阶 O(n)线性对数阶 O(nlogn)平方阶 O(n^2) 立方阶O(n^3) k次阶。。。非多项式量阶的问题为非确定多项式问题,即NP问题O(1) 即代码的执行时间与n无关,执行此处往往是一个确定值,算法中不存在循环原创 2020-08-11 15:52:06 · 520 阅读 · 0 评论