数据结构与刷题
刷题总结
梦世
这个作者很懒,什么都没留下…
展开
-
31. 下一个排列(Letcode)
题目31. 下一个排列实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须原地修改,只允许使用额外常数空间。以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,3→1,3,23,2,1→1,2,31,1,5→1,5,1解题思路降序的下一个排序是升序,例如3 2 1 -> 1 2 3,可以从这个角度去思考这个问题。改变顺序如下:4 5 2 6 3 ...原创 2020-11-10 18:47:48 · 166 阅读 · 0 评论 -
数组、链表和跳表的基本实现、特性
目录数组链表跳表(Skip List)数组数组的实现在计算机中,底层的硬件实现的话会有一个内存管理器的东西,每当申请一个数组计算机会在内存之中开辟一段连续的地址,每一个地址就可以通过内存管理器进行访问。访问的时间复杂度O(1),增加与删除,在java.util.ArrayList中的操作核心在于使用System.arraycopy()方法,例如:显然如果在对你的数组有频繁的修改的时候,会出现大量想的复制操作。链表针对上面数组的缺点,使用链表改进。在Jav原创 2020-06-08 22:05:28 · 143 阅读 · 0 评论 -
高级数据结构
优先队列向上:新增节点向下:堆顶被取初始化大小为n的堆,时间复杂度:O(n)LetCode:347. 前 K 个高频元素class Solution { public static int[] topKFrequent(int[] nums, int k) { int[] result = new int[k]; Map<Integer, Integer> map = new HashMap<Integer, Integer>原创 2020-07-09 16:01:13 · 165 阅读 · 0 评论 -
动态规划题目练习
线性规划区间规划约束01背包问题原创 2020-07-18 17:11:57 · 147 阅读 · 0 评论 -
代码效率优化
注:在学习拉勾中公瑾 所讲的数据结构做的笔记代码效率优化总结代码执行过程中会消耗计算时间和计算空间,我们希望计算机能够在它的性能范围内更好的运行并且不同的计算机计算时间与空间有各种因素的影响,代码可以运行在不同计算机上的,因此关注代码本身,通过分析时间或者空间消耗量与输入数据量之间的关系,而不是时间与空间本身,使用复杂度来度量:复杂度是一个关于输入数据量 n 的函数。容易得出几个规则:复杂度与具体的常系数无关 多项式级的复杂度相加的时候,选择高者作为结果 O(1) 也是表示与输入数据量...原创 2020-05-26 16:11:22 · 551 阅读 · 0 评论 -
设计数据结构的方法论
数据在代码中被处理、加工的最小单位动作,也就是数据结构的基本操作,有了这些动作之后,就可以基于此去选择更合适的数据结构了。代码对数据的处理范例:在一个数组中找出出现次数最多的那个元素的数值。例如,输入数组 a = [1,2,3,4,5,5,6] 中,只有 5 出现了两次,其余都是 1 次。显然 5 出现的次数最多,则输出 5。为了降低时间复杂度,我们引入了 k-v 的字典的数据结构。那么问题来了,究竟是什么原因,促使我们想到了使用字典的数据结构呢?如果不使用字典,改为使用数组行...原创 2020-06-18 12:40:03 · 2885 阅读 · 0 评论 -
二叉树、 树的遍历操作、 二叉查找树 、 Trie 树(字典树)
目录二叉树树的遍历操作二叉查找树Trie 树(字典树)总结二叉树在二叉树中,有下面两个特殊的类型,如下图所示: 满二叉树,定义为除了叶子结点外,所有结点都有 2 个子结点。 完全二叉树,定义为除了最后一层以外,其他层的结点个数都达到最大,并且最后一层的叶子结点都靠左排列。 存储二叉树有两种办法,一种是基于指针的链式存储法,另一种是基于数组的顺序存储法。 链式存储法,也就是像链表一样,每个结点有三个字段,一个存储数据,另外两个分别存放指向左右子结点的指原创 2020-06-30 11:52:16 · 463 阅读 · 0 评论 -
哈希的核心思想?哈希表函数有哪些?哈希冲突怎么解决?哈希的优缺点?
目录哈希的核心思想?哈希表函数有哪些?哈希冲突怎么解决?开放定址法链地址法再哈希法建立公共溢出哈希的优缺点?哈希的核心思想?线性表和树数据的存储位置和数据的具体数值之间不存在任何关系。因此,在面对查找问题时,这些数据结构必须采取逐一比较的方法去实现。而哈希表的设计采用了函数映射的思想,将记录的存储位置与记录的关键字关联起来。这样的设计方式,能够快速定位到想要查找的记录,而且不需要与表中存在的记录的关键字比较后再来进行查找。如果有一种方法,可以实现“地址 = .原创 2020-06-30 12:23:36 · 1266 阅读 · 0 评论 -
分治法核心思想、经验总结、二分查找案例
目录分治法二分查找经验与总结分治法计算机求解问题所需的计算时间,与其涉及的数据规模强相关。简而言之,问题所涉及的数据规模越小,它所需的计算时间也越少;反之亦然。分治法的核心思想是“分而治之”,当你需要采用分治法时,一般原问题都需要具备以下几个特征: 难度在降低,即原问题的解决难度,随着数据的规模的缩小而降低。这个特征绝大多数问题都是满足的。 问题可分,原问题可以分解为若干个规模较小的同类型问题。这是应用分治法的前提。 解可合并,利用所有子问题的解,可合并出原原创 2020-07-01 10:22:17 · 636 阅读 · 0 评论 -
排序问题
目录冒泡排序插入排序归并排序快速排序堆排序性能分析总结衡量一个排序算法的优劣,主要会从以下 3 个角度进行分析:1.时间复杂度,具体包括,最好时间复杂度、最坏时间复杂度以及平均时间复杂度。2.空间复杂度,如果空间复杂度为 1,也叫作原地排序。3.稳定性,排序的稳定性是指相等的数据对象,在排序之后,顺序是否能保证不变。冒泡排序从第一个数据开始,依次比较相邻元素的大小。如果前者大于后者,则进行交换操作,把大的元素往后交换。通过多轮迭代,直到没有交换操作原创 2020-07-04 20:59:00 · 2355 阅读 · 0 评论 -
递归:如何利用递归求解汉诺塔问题?回溯:组合总和、N皇后
目录递归的算法思想汉诺塔问题递归的基本思想就是把规模大的问题转化为规模小的相同的子问题来解决。 在函数实现时,因为大问题和小问题是一样的问题,因此大问题的解决方法和小问题的解决方法也是同一个方法。这就产生了函数调用它自身的情况,这也正是递归的定义所在。递归的算法思想递归的数学模型其实就是数学归纳法。一个常见的题目是:证明当 n 等于任意一个自然数时某命题成立。当采用数学归纳法时,证明分为以下 2 个步骤: 证明当 n = 1 时命题成立; 假设 n = m 时命题原创 2020-06-30 15:20:43 · 499 阅读 · 0 评论 -
字符串与数组的基本概念及LetCode真题
目录数组数组是什么数组的基本操作数组的新增操作数组的删除操作数组的查找操作数组增删查操作的特点链表存在的价值又是什么呢?总结字符串字符串是什么字符串的基本操作字符串的新增操作字符串的删除操作子串查找(字符串匹配)字符串匹配算法的案例总结数组数组是什么数组可以把这些具有相同类型的元素,以一种不规则的顺序进行排列,这些排列好的同类数据元素的集合就被称为数组。数组在内存中是连续存放的,数组内的数据,可以通过索引值直接取出得到。实际原创 2020-06-26 16:43:51 · 189 阅读 · 0 评论 -
链表基础知识、解题技巧、LetCode真题
目录链表(线性表)基本概念种类增删查操作增加操作删除操作查找操作总结链表解题技巧链表翻转(三个指针)快慢指针(两个指针)LetCode题目206. 反转链表876. 链表的中间结点141. 环形链表数据结构是数据的组织方式。链表(线性表)基本概念种类链表节点: // Definition for singly-linked list.public class ListNode { int val; ListN原创 2020-06-24 12:52:56 · 217 阅读 · 0 评论 -
栈与队列的基本概念、应用、LetCode真题
栈的基本概念栈是什么线性表增加和删除操作限制在一端进行,就被称为栈。那为什么要使用栈?其实,单纯从功能上讲,数组或者链表可以替代栈。然而问题是,数组或者链表的操作过于灵活,这意味着,它们过多暴露了可操作的接口。这些没有意义的接口过多,当数据量很大的时候就会出现一些隐藏的风险。一旦发生代码 bug 或者受到攻击,就会给系统带来不可预知的风险。虽然栈限定降低了操作的灵活性,但这也使得栈在处理只涉及一端新增和删除数据的问题时效率更高。具体而言,栈的数据结点必须后进先出。后进的意思是,栈的数据新原创 2020-06-30 10:37:07 · 330 阅读 · 0 评论 -
深度优先搜索(DFS)与广度优先搜索(BFS)、LetCode题目
目录DFSBFSDFS注标记是否访问过方法:1、直接修改输入的数据 2、利用额外的数据结构(矩阵或hash表)Step4: 判断是否访问过 和 抵达目的地,访问过就不尝试,抵达目的地返回trueBFS...原创 2020-07-10 12:02:30 · 223 阅读 · 0 评论 -
动态规划定义、分类、Letcode题目
什么是动态规划?300. 最长上升子序列递归解法:加入备忘录:非递归第一个难点,不仅是为了避免重复计算,也是推导状态转移方程的关键,这个难点解决了,状态转移方程呼之欲出了。考虑这个难点时,往往是将问题规模缩小的过程中进行的,一个有效的思考方法:不妨假设已经有人将所有子问题的最佳结果计算出来了,留下的问题只有一个:如果根据这些子问题的结果得出最终的答案。LetCode70、300、198 中看i个状态时,i是...原创 2020-07-11 09:47:20 · 196 阅读 · 0 评论 -
二分搜索算法与贪婪算法
目录二分搜索贪婪算法LetCode二分搜索代码34. 在排序数组中查找元素的第一个和最后一个位置二分搜索贪婪算法LetCode二分搜索代码public class Solution { public static void main(String[] args) { int[] nums = new int[] {0,1,2,3,4,5,6,原创 2020-07-13 13:49:57 · 841 阅读 · 0 评论 -
LetCode高频题
目录3. 无重复字符的最长子串(快慢指针、哈希表)4. 寻找两个正序数组的中位数3. 无重复字符的最长子串(快慢指针、哈希表)线性:class Solution { public int lengthOfLongestSubstring(String s) { int max = 0 ; Set<Character> set = new HashSet<Character>() ; for(in...原创 2020-07-14 21:24:26 · 145 阅读 · 0 评论