数据结构与算法
手撕算法,吊打面试官!
长不胖的小番茄
你有多努力,就有多特殊!
展开
-
吃完早饭,画一下快速排序算法
以 12,11,15,23,8,10为例随机选取一个基准,我是习惯性选取第一个元素,以12为基准一、以12为基准由于选的基准元素是左边的,所以最右边开始遍历比较。10小于12,则a[i]=a[j]然后,从左遍历比较,由于刚刚交换了元素,所以L前进一步,即++i11小于12,则不动。L继续前进一步,++i15大于12,则a[j]=a[i]由于刚刚交换了元素,则R后退一步,即–j8小于12,则把8放左边,a[i]=a[j]由于刚刚交换了元素,所以L前进一步,即++i15大于1原创 2022-04-20 12:14:12 · 947 阅读 · 3 评论 -
手撕算法---爬楼梯,我用递归实现,让我伤心了
周一打卡leetcode爬楼梯这道算法题,我思考良久,决定使用递归实现,调试完没问题呀!刚提交就给我报超出时间限制。。。不讲武德,欺负小姑凉果不其然,递归代码虽然简洁高效,但是,也有很多弊端。比如,堆栈溢出、重复计算、函数调用耗时多、空间复杂度高等问题。leetcode 70.爬楼梯假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?示例1:输入:n = 2输出:2解释:有两种方法可以爬到楼顶。1. 1 阶 + 1原创 2022-03-07 15:06:54 · 691 阅读 · 0 评论 -
手撕算法---基于数组实现栈的数据结构
从功能上来说,数组或链表确实可以替代栈,但是,特定的数据结构是对特定场景的抽象!当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,这时我们就应该首选“栈”这种数据结构。栈既可以用数组来实现,也可以用链表来实现。用数组实现的栈,我们叫作顺序栈,用链表实现的栈,我们叫作链式栈。1.基于数组实现的顺序栈public class ArrayStack { private String[] items; // 数组 private int count; // 栈中原创 2022-03-04 15:13:59 · 319 阅读 · 0 评论 -
手撕算法---LRU缓存淘汰策略,问的这么频繁
众所周知,缓存的大小有限!当缓存被用满时,这就需要缓存淘汰策略来决定哪些数据应该被清理出去。常见的策略有三种:先进先出策略 FIFO(First In,First Out)、最少使用策略 LFU(Least Frequently Used)、最近最少使用策略 LRU(Least Recently Used)。看下LeetCode上这道LRU设计题:1.请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。实现 LRUCache 类:LRUCache(int capacity原创 2022-03-02 22:48:03 · 565 阅读 · 0 评论 -
手撕算法---链表注意点,警惕指针丢失和内存泄漏
写链表代码非常考验思维能力!到处是指针的操作,边界条件的处理,大学时学习数据结构,都没有思考这么全面。以单链表为例:插入一个节点1.注意一定要先将新的结点的next指针指向b结点,再将a的next指针指向新结点,否则颠倒顺序的话会引起指针丢失,自己指向自己!// 将m的结点的next指针指向b结点;m->next = a->next; // 将a的next指针指向m结点;a->next = m; 2.当链表为空,插入新节点,第一个结点和其他结点的插入逻辑是不一样的。原创 2022-02-25 17:10:33 · 990 阅读 · 0 评论