数据结构与算法
所追寻的风
https://blog.seekwind.icu
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
455.分发饼干
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/assign-cookies实现:原创 2020-12-25 16:25:26 · 282 阅读 · 0 评论 -
135.分发糖果
老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。你需要按照以下要求,帮助老师给这些孩子分发糖果:每个孩子至少分配到 1 个糖果。相邻的孩子中,评分高的孩子必须获得更多的糖果。那么这样下来,老师至少需要准备多少颗糖果呢?链接:https://leetcode-cn.com/problems/candyclass Solution: def candy(self, ratings) -> int: n = len(ra.原创 2020-12-25 16:25:05 · 171 阅读 · 0 评论 -
八、动态规划入门
这一部分内容是给基础较好的同学准备的,关系到压轴题。如果前面基础不牢固,建议不用仔细看这部分动态规划Dynamic Programming,是一类优化算法,原问题的最优解往往建立在子问题的最优解的基础上,叫做最优子结构。例如,你在30天内能学完多少数据结构呢?我们将这个问题的解记作DP(30)。那么显然有DP(30) = DP(29) + DP(1),即要求你在前29天内尽可能多学 + 第三十天尽可能多学。写成递推式就是DP(n) = DP(n-1) + DP(1)。那么以此类推,可以得到DP(n.原创 2020-07-24 20:42:47 · 471 阅读 · 0 评论 -
七、图算法
1. 图的定义把节点通过任意方式连接起来,就叫图。二叉树也是图的一种。图分为有向图(带箭头)和无向图(也叫双向图,不带箭头)基本代码class Vertex{ private String key; // 键值 Color color; // 颜色(状态) int d; // 离根节点的最小距离 Vertex pi; // 父节点}2. 图的表示方法2.1 邻接链表由X节点相邻的节点,构成的链表,称为临接链表。上图中,的邻接链表:1的原创 2020-07-24 20:39:14 · 582 阅读 · 0 评论 -
六、二叉树
1. 下面这个东西就叫做二叉树二叉树节点的代码:class TreeNode{ int key; // 键值 TreeNode left; // 左孩子 TreeNode right; // 右孩子 TreeNode parent; // 父节点(有时需要) //构造器 public TreeNode(int key){ this.key = key; left = null; right =原创 2020-07-24 20:37:28 · 344 阅读 · 0 评论 -
五、线性表(堆、栈、链表)
线性表(栈、队列、链表)1. 栈、队列、链表的比较属性栈 Stack队列 Queue链表 LinkedList进出顺序先进后出先进先出无所谓,都可以增加元素压栈Push(进入栈顶)入队Enqueue(进入队尾)插入Insert(插入任意位置)减少元素弹栈Pop(取出栈顶元素)出队Dequeue(取出队头元素)删除节点Delete(从任意位置删除)高级操作深度优先搜索(DFS)广度优先搜索(BFS)--------2. 栈、队列、链表原创 2020-07-24 20:34:09 · 575 阅读 · 0 评论 -
四、线性复杂度排序算法(我觉得不重要,但他PPT里有)
只能用于整数数组。时间复杂度均为O(n)。1. 计数排序 Counting Sortpublic static int[] countingSort(int[] A){ int[] B = new int[A.length]; int k = A[0]; //寻找数组中的最大值 for (int i = 1; i < A.length; i ++){ if (A[i] > k) k = A[i]; } /.原创 2020-07-24 20:32:00 · 370 阅读 · 0 评论 -
三、二叉堆(以最小堆为例)
1. 定义与基本特性二叉堆是用数组描述的完全二叉树。下面对定义中的名词作简单解释。1.1 完全二叉树即树上全部的结点都按照从上到下、从左到右的顺序依次填满树。如下图就是一颗完全二叉树。如果将第6个元素(也就是圆圈9)从树中删去,则树未能填满,不是完全二叉树。1.2 本质是数组当我们在写代码时,二叉堆其实就是一个数组a[]。只不过我们给这个数组赋予了特殊的意义,即:**a[2*i]是a[i]**的左子节点**a[2*i+1]是a[i]**的右子节点**a[i/2]是a[i]**的父节点(注意原创 2020-07-24 20:30:50 · 744 阅读 · 0 评论 -
一、归并排序
算法思想:分治策略时间复杂度:O(n·logn)空间复杂度:O(n·logn) 非原地算法1.函数主体public static void mergeSort(double[] a,int l,int r){ if (l < r){ int m = (l + r) / 2;//把数组分成等长的左右两个 mergeSort(a, l, m);//递归左侧数组,使左侧数组有序 mergeSort(a, m+1, r);//递归右侧数组,使.原创 2020-07-24 20:28:06 · 382 阅读 · 0 评论 -
二、快速排序
1. 函数主体public static void quickSort(int[] a,int p, int r){ if (p < r){ //partition函数,将数组分割为两部分,a[q]左侧数组元素小于a[q],a[q]右侧数组元素大于a[q] int q = partition(a,p,r); //左右两侧数组递归调用quickSort quickSort(a,p,q-1); quickSort(a原创 2020-06-28 20:46:38 · 455 阅读 · 0 评论
分享