
数据结构
wh义华
观千剑而后识器,操千曲而后晓声。
展开
-
常见排序算法
这些基础的算法真是容易忘,一段时间不写细节就不会处理了。1、初级的桶排序如需要对10以内的数进行排序,可以先初始化一个长度为10的数组。然后遍历,遍历到哪个数就将数组对应的下标加1,如遍历到3,则a[3]++。整个遍历结束后,再通过输出数组即可得到有序数据。需要注意的是,a[i]是多少则需要打印多少次。这种算法相当于是用下标记录数据,用值记录次数。该算法的优点是快速,其时间复杂度是O(n)。但是该算法的缺点是占用过多的空间,如果需要对10000个数排序,那么需要申请长度10000数组来存储,相当于用原创 2021-04-12 19:52:19 · 425 阅读 · 0 评论 -
合并区间
Leetcode56 题目:以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。解法代码如下:def merge(self, intervals: List[List[int]]) -> List[List[int]]: def takeFirst(x): return x[0] intervals.sort(key=原创 2021-02-20 21:16:47 · 125 阅读 · 0 评论 -
队列的使用场景之一
在android中经常有在多少秒内点击某个按钮多少下的需求,之前在网上的博客找到的解决方法如下:// 定义hit的长度,需要点击多少下就申明多长的数组,用于记录每次点击的时间戳。mHits = new long[5];System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1); //把从第二位至最后一位之间的数字复制到第一位至倒数第一位,相当于不断丢弃第一位上的数字。 mHits[mHits.length - 1] = SystemCloc原创 2021-02-20 15:44:37 · 173 阅读 · 2 评论 -
LRU算法基础实现
1、LRU算法含义LRU算法,全称为least recently used,也即最近最久未使用算法。当LRU缓存达到上限时,该算法会将最久未使用的数据淘汰掉,从而腾出空间给即将添加的数据。2、LRU算法的设计3、LRU算法的基本实现首先,定义双链表节点。class ListNode: def __init__(self, key, value): self.key = key self.value = value self.next = No原创 2021-02-11 14:12:28 · 387 阅读 · 2 评论 -
三数之和
Leetcode15 题目:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。示例:给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:[[-1, 0, 1],[-1, -1, 2]]有了两数之和基础之后,此处也采用类似的思想。 即通过遍历其中一个数,剩余的就是两数之和。代码如下:def threeSum(self, nums: Li原创 2021-01-05 19:23:29 · 141 阅读 · 0 评论 -
使用图算法实现地铁线路规划
1、概述2、DFS方法3、BFS方法4、弗洛伊德算法5、Dijkstra算法6、总结原创 2021-01-02 21:03:01 · 4729 阅读 · 6 评论 -
两个数组的交集
给定两个数组,编写一个函数来计算它们的交集。示例 1:输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2,2]示例 2:输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[4,9]如下题解的思路值得借鉴, 有点类似链表的相加操作。def intersect(self, nums1, nums2): # 排序是基础 nums1.sort() nums2.sort()原创 2020-12-14 19:50:13 · 96 阅读 · 0 评论 -
两个字符串的删除操作
leetcode583题目: 给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。输入: “sea”, “eat”输出: 2解释: 第一步将"sea"变为"ea",第二步将"eat"变为"ea"在用动态规划算法做了最长公共子序列的题目后,发现此题也可用类似解法来做。最长公共子序列的做法,可以学习这篇leetcode题解,写的非常好。主要是这个图片非常的形象(摘自leetcode,刚上面链接),如下:按照这原创 2020-12-03 10:49:20 · 301 阅读 · 0 评论 -
剩余最少的钱
有一批价格分别为p1,p2, p3 … pn的n种商品, 你手中持有金钱为money,如何购买商品使剩余的钱最少,求最少剩多少?示例一:输入 p=[150, 200, 350], money = 250输出:50示例二:输入 p=[150, 200, 350], money = 500输出:0解法一,深度优先搜索。# 深度优先搜索算法, 个人感觉这种算法就是将多层for循环扁平化def leastMoneyLeft(money, prices): goods = [money /原创 2020-12-02 15:13:13 · 1073 阅读 · 0 评论 -
买卖股票的最佳时机 II
Leetcode122. 买卖股票的最佳时机 II给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1:输入: [7,1,5,3,6,4]输出: 7解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。随后,在第 4 天(股票价格原创 2020-11-30 19:05:24 · 122 阅读 · 0 评论 -
旋转数组
数据结构高分笔记中的题,将数组移多少位的题目。这里有几点要注意,是左移还是右移,需要区分这个。还有就是移动的长度大于数组长度的处理。原创 2020-11-29 11:00:48 · 105 阅读 · 0 评论 -
链表相交
给定两个(单向)链表,判定它们是否相交并返回交点。请注意相交的定义基于节点的引用,而不是基于节点的值。换句话说,如果一个链表的第k个节点与另一个链表的第j个节点是同一节点(引用完全相同),则这两个链表相交。...原创 2020-11-28 15:37:24 · 115 阅读 · 0 评论 -
稀疏数组搜索
稀疏数组搜索稀疏数组搜索。有个排好序的字符串数组,其中散布着一些空字符串,编写一种方法,找出给定字符串的位置。示例1:输入: words = [“at”, “”, “”, “”, “ball”, “”, “”, “car”, “”, “”,“dad”, “”, “”], s = “ta”输出:-1说明: 不存在返回-1。示例2:输入:words = [“at”, “”, “”, “”, “ball”, “”, “”, “car”, “”, “”,“dad”, “”, “”], s = “bal原创 2020-11-27 21:42:32 · 247 阅读 · 0 评论 -
旋转矩阵
将一个矩阵旋转的题,考虑转置原创 2020-10-09 09:16:30 · 189 阅读 · 0 评论 -
整数转罗马数字
题目:罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。通原创 2020-09-22 15:54:53 · 115 阅读 · 0 评论 -
电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。(图与手机的9宫格键盘一样)开始想的是多重循环,但是字母长度是不确定,这么做肯定是不现实的。 于是很自然就想到了回溯算法,本质还是多重循环。这里也让我想起了之前看的《啊啥 算法》一书中的深度优先算法推导中的例子了。public List<String> letterCombinations(String digits) { if (digits原创 2020-09-10 21:31:42 · 193 阅读 · 0 评论 -
最长同值路径
最长同值路径,有点类似最大路径和。原创 2020-09-01 19:26:12 · 209 阅读 · 0 评论 -
录找重复的子树
题目:给定一棵二叉树,返回所有重复的子树。对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。两棵树重复是指它们具有相同的结构以及相同的结点值。示例 1: 1 / \ 2 3 / / \4 2 4 / 4下面是两个重复的子树: 2 /4和4因此,你需要以列表的形式返回上述重复子树的根结点。初看此题,没什么思路,只想到了暴力解法。哎,但题目考察的肯定不是我这种做法。我的想法最初是两两对比每个节点,看它们是不是相同的树。 有原创 2020-08-08 15:44:20 · 122 阅读 · 0 评论 -
二叉树的最近公共祖先
求二叉树中两个节点 的最近公共祖先。找两个节点的最近公共祖先的问题,原创 2020-07-18 09:32:25 · 193 阅读 · 0 评论 -
两个栈实现一个队列
用两个栈实现一个队列。由于栈的特性是后进先出,而队列的特性是先进先出。当A栈从栈底到栈顶依次有元素1,2,3。而要模拟队列时,出队列必需是1,2,3。此时,则可以将栈A中的元素依次弹出,进入栈B,则形成3,2,1的顺序,再从栈B弹出时就是1,2,3的顺序了。有了这个思想就可以写出如下代码:// 用于进队列Deque<Integer> first = new ArrayDeque<Integer>();// 用于出队列,出队的元素必需从此栈弹出。如果为空时将first栈中的原创 2020-07-02 14:03:36 · 110 阅读 · 0 评论 -
最长回文子串
题目:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。原创 2020-06-22 18:56:11 · 201 阅读 · 0 评论 -
二叉树中的最大路径和
题目:给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。刚看到题目就先入为主的以为最大路径和不是在左边就是在右边,然后用递归实现求单边分支最大值,方法 如下:// 该方法求解的是当前节点加上左分支 【或】 右分支的最大路径和。public int oneSideMax(TreeNode root) { if (root == null) { return 0; }原创 2020-06-09 22:40:07 · 328 阅读 · 0 评论 -
恢复二叉搜索树
二叉搜索树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。其中,要明确的是只有两个节点被错误的交换。所以我们要做的是将这两个节点找出来,并将他们交换。我之前做题时没有仔细看题,以为是一棵乱序的树需要恢复。清楚题意后,我们再通过二叉搜索树中序遍历的有序性质来找出错误的两个节点。使用递归的方式找出错误的节点如下:// 记录前一个节点,用于比较TreeNode prev = null;// 标识两个被错误交换的节点TreeNode first = null;TreeNode se原创 2020-06-09 15:51:08 · 192 阅读 · 0 评论 -
二叉树是否对称
题目:给定一棵二叉树,判定它是否是镜像对称的。如下是一棵镜像二叉树。 1 / \ 2 2 / \ / \3 4 4 3我最开始的想法是这样的, 如下/** * 对称二叉树 */public boolean isSymmetric(TreeNode root) { if (root == null) { return true; } TreeNode t1 = root.left; TreeNode t2 = root原创 2020-05-15 10:20:36 · 204 阅读 · 0 评论 -
判断一棵树是否是合法二叉树
题目:给定一棵树,判断是否是合法的二叉搜索树。如果合法返回true,不合法则返回false。首先,应该明确二叉搜索树的定义,二叉搜索树是一个递归的定义,即二叉搜索树的左子节点小于根节点,而右节点大于根节点,同时左右子树也是一棵二叉搜索树。错误的想法:先判断根节点和左右子节点的大小关系,如果不符合大小关系,直接返回false。如果符合,则递归调用判断左右子树是否合法。如下:...原创 2020-05-12 10:38:09 · 1135 阅读 · 0 评论 -
删除链表的倒数第N个节点
题干:给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.如果没有快慢指针的思想, 我可能就是通过遍历两遍来解决。第一次遍历...原创 2020-04-25 15:19:35 · 165 阅读 · 0 评论 -
对链表进行归并排序
题干:对一个链表进行归并排序。对于数组,归并排序的思想是先将数据分成两部份,分别排序。然后再对已经排好序的两个数组归并。其中在对两部份数组排序时进行递归,最后得到的即是排好序的数组。对于链表,归并的思想也是如此。需要解决的问题有两个,第一个是如何将链表平均分成两部份。 第二个是将两个有序链表合并成一个有序链表。 解决了这两个问题,归并排序链表就迎仞而解了。对于第一个问题,可以采用快慢指针的方...原创 2020-04-21 15:48:59 · 1449 阅读 · 0 评论 -
合并k个有序链表
题干:合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。示例:输入:[1->4->5,1->3->4,2->6]输出:1->1->2->3->4->4->5->6此题为Leetcode中23题。由于此前有合并两个有序链表的经验,开始看到这个题,很自然就想到了,每次在k个链表中选取一个最小的...原创 2020-04-16 14:05:52 · 197 阅读 · 0 评论