东隅已逝,桑榆非晚
队列实现栈以及栈实现队列 队列实现栈以及栈实现队列
队列实现栈以及栈实现队列队列是一种先进先出的数据结构,栈是一种先进后出的数据结构,形象一点就是这样: 这两种数据结构底层其实都是数组或者链表实现的,只是 API 限定了它们的特性 今天来看看如何使用「栈」的特性来实现一个「队列」,如何用「
单链表的花式反转方法汇总 单链表的花式反转方法汇总
反转整个单链表在 力扣/LeetCode 中,单链表的通用结构是这样的: # 单链表节点的结构 class ListNode: def __init__(self, x): self.val = x
滑动窗口算法核心 滑动窗口算法核心
滑动窗口可以归为快慢双指针,一快一慢两个指针前后相随,中间的部分就是窗口。滑动窗口算法技巧主要用来解决子数组问题,比如让你寻找符合某个条件的最长/最短子数组。 滑动窗口框架概览如果用暴力解的话,你需要嵌套 for 循环这样穷举
链表双指针 链表双指针
链表的合并 有些题目虽然不是链表的题目,但其中蕴含了合并有序链表的思想。 264. 丑数 II 力扣 给你一个整数 n ,请你找出并返回第 n 个 丑数 。 丑数 就是质因子只包含 2、3 和 5 的正整数。 示例 1: 输入:n &#x
如何高效寻找素数 如何高效寻找素数
素数的定义看起来很简单,如果一个数如果只能被 1 和它本身整除,那么这个数就是素数 比如力扣第 204 题计数质数 常规思路我们可以从 2 开始,判断每个数是否是素数,如果是素数,我们就把count加1,如果不是素数,我们就跳过它。
桶排序 桶排序
桶排序算法的核心思想分三步: 1、将待排序数组中的元素使用映射函数分配到若干个「桶」中。 2、对每个桶中的元素进行排序。 3、最后将这些排好序的桶进行合并,得到排序结果。
计数排序 计数排序
计数排序的原理比较简单:统计每种元素出现的次数,进而推算出每个元素在排序后数组中的索引位置,最终完成排序。 想法比方说,输入一个 nums 数组,我统计出其中有 2 个元素 1,1 个元素 3,3 个元素 6,那么只要我在数组中依次填入
堆排序 堆排序
堆排序是从 二叉堆结构 衍生出来的排序算法,复杂度为 $O(NlogN)$。堆排序主要分两步,第一步是在待排序数组上原地创建二叉堆(Heapify),然后进行原地排序(Sort)。 想法 堆排序的两个关键步骤: 1、原地建堆(Heapi
归并排序 归并排序
归并排序的核心思路需要结合二叉树的后序遍历 来理解:先利用递归把左右两半子数组排好序,然后在二叉树的后序位置合并两个有序数组。 归并排序核心思路前文快速排序的思路是,先把一个元素放到正确的位置(排好序),然后将这个元素左右两边剩下的元素
快速排序 快速排序
快速排序的核心思路需要结合二叉树的前序遍历 来理解:在二叉树遍历的前序位置将一个元素排好位置,然后递归地将剩下的元素排好位置。 快速排序核心思路快速排序的基本思路是这样的: 1、在 nums 数组中任意选择一个元素作为切分元素 pivo
希尔排序 希尔排序
希尔排序是基于插入排序 的简单改进,通过预处理增加数组的局部有序性,突破了插入排序的$O(n^2)$时间复杂度。 h有序数组一个数组是h有序的,是指这个数组中任意间隔为 h(或者说间隔元素的个数为 h-1)的元素都是有序的。 这个概念用
插入排序 插入排序
插入排序是基于选择排序的一种优化,将 nums[sortedIndex] 插入到左侧的有序数组中。对于有序度较高的数组,插入排序的效率比较高。 练习题目: 力扣第 912 题 数组排序,先不纠结时间复杂度。 想法选择排序的思路是:在
3 / 4