数据结构与算法
以简洁的思路梳理数据结构与算法的相关知识
是宇哥啊
叩首问路 码梦为生
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
谈谈数组和链表的时间复杂度
数据结构随机访问插入/删除数组O(1) ✅O(n) ❌链表O(n) ❌O(1) ✅链表插入一定比数组快吗?答案是否定的:之前说的插入 O(1)当你已经拿到插入位置的节点指针时,修改指针的操作本身是 O(1)。原创 2025-09-23 18:33:36 · 716 阅读 · 0 评论 -
一篇文章讲清楚常见的数据结构
线性结构:数组、链表、栈、队列树结构:二叉树、堆、平衡树图结构:有向、无向、加权图哈希结构:哈希表数组/链表→ 存放数据栈/队列→ 控制流程树/图→ 表达关系哈希表→ 快速索引。原创 2025-09-23 18:10:38 · 287 阅读 · 0 评论 -
Mac版本Android Studio配置LeetCode插件
第三步:使用Google Chrome浏览器登录LeetCode,苹果自带的浏览器没有做研究了,感觉比较麻烦。JCEF 是 Java 对 Chromium Embedded Framework (CEF) 的封装,允许在 Java 应用中嵌入 Chromium 浏览器引擎。第一步:Android Studio里面找到Settings,找到Plugins,在Marketplace里面搜索LeetCode Editor。第二步:安装对应插件,并在Tools->LeetCode Plugin页面输入帐号和密码。原创 2025-06-03 20:05:09 · 986 阅读 · 0 评论 -
leetcode 72-编辑距离
长度为i的word1的index是i-1,长度为j的word2的index是j-1。如果在这个index上字符一样的话,就是不需要操作的意思:dp[i][j] = dp[i - 1][j - 1]。最后一种情况不是很好理解,这里重点说明以下:简单来说,我们在word1增加一个字符,这个字符肯定是word2的字符。然后这个字符我们就不需要考虑了。dp[i][j]表示长度为i的word1转换为长度为j的word2最小编辑次数。这道题如果不用动态规划去解决,将是一个极其复杂的问题。原创 2023-07-25 18:00:08 · 305 阅读 · 0 评论 -
DFS(深度优先搜索)--路劲总和
利用深度优先搜索遍历二叉树,每次减去对应的节点值。题解:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { public boolean hasPathSum..原创 2021-01-29 23:30:07 · 149 阅读 · 0 评论 -
Leetcode刷题--数组序号转换
思路:可以先克隆一个一样的数组,然后排序,讲数组值作为key,序号作为value放入一个Map。题解:class Solution { public int[] arrayRankTransform(int[] arr) { int [] temp = arr.clone(); HashMap<Integer,Integer> map = new HashMap(); Arrays.sort(temp); in..原创 2021-01-29 22:13:46 · 182 阅读 · 0 评论 -
Leetcode刷题--矩阵对角线元素的和
题解:class Solution { public int diagonalSum(int[][] mat) { int n = mat.length; int sum = 0; for(int i = 0;i < n;i++){ sum += mat[i][i]; sum += mat[i][n-i-1]; } if(n % 2 != 0){ ...原创 2021-01-23 21:24:24 · 294 阅读 · 0 评论 -
Leetcode刷题--二叉搜索树节点的最小距离
在Leetcode上刷了这么一道题,我感觉思想挺好的,分享一下:思路:首先通过深度优先搜索把每个不为null的节点val加到一个集合中,然后遍历集合,找差值的最小值。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; }原创 2021-01-23 15:52:10 · 190 阅读 · 0 评论 -
Leetcode刷题--存在重复元素II
题解:class Solution { public boolean containsNearbyDuplicate(int[] nums, int k) { HashMap<Integer,Integer> map = new HashMap<Integer,Integer>(); for(int i = 0;i < nums.length;i++){ if(map.containsKey(nums[i..原创 2021-01-23 14:01:14 · 154 阅读 · 0 评论 -
Leetcode刷题--移除链表元素
思路:题解:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next..原创 2021-01-21 21:39:27 · 158 阅读 · 0 评论 -
Leetcode刷题--亲密字符串
分析:如果两个字符串字符个数不相等,则返回false;下面的其他情况都是基于两个字符串字符个数相等:如果两个字符串相同位置字符相同的个数小于或者等于总字符个数减去3,那么一定返回false;如果两个字符串相同位置字符相同的个数等于总字符个数减去1,一定返回false;如果两个字符串相同位置字符相同个数等于总字符个数,那么分情况讨论:如果存在重复字符,返回true,否则false;如果两个字符串相同位置字符相同个数等于总字符个数减去2,那么返回true的情况就是去校验其中一个字符串剩下两个..原创 2021-01-20 21:47:35 · 211 阅读 · 2 评论 -
N叉树的前序遍历
递归法:/*// Definition for a Node.class Node { public int val; public List<Node> children; public Node() {} public Node(int _val) { val = _val; } public Node(int _val, List<Node> _children) { val ...原创 2021-01-20 00:15:57 · 152 阅读 · 0 评论 -
Leetcode刷题--逆波兰表达式求值
根据 逆波兰表示法,求表达式的值。有效的运算符包括+,-,*,/。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明:整数除法只保留整数部分。给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。示例1:输入: ["2", "1", "+", "3", "*"]输出: 9解释: 该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9示例2:输入: ["4", "13", "5", "/", "+...原创 2021-01-18 22:54:51 · 221 阅读 · 0 评论 -
Leetcode找自信题--重新排列字符串
这是我最近刷到最简单的题,我想也无需过多解释,纯粹找自信。class Solution { public String restoreString(String s, int[] indices) { char [] ch = s.toCharArray(); char [] ch2 = new char[ch.length]; for(int i = 0;i < indices.length;i++){ ch2..原创 2021-01-16 23:26:25 · 271 阅读 · 0 评论 -
对称二叉树
这道题在Leetcode上也是一道简单题,但是这道题的思想确是非常的好!首先我们去了解题目的意思:我们在root节点上画一条辅助线,那么这棵树的左边和右边可以完全折合起来,就好像是在照镜子一般。于是乎我们从跟节点开始自上而下递归:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; *..原创 2021-01-16 23:11:27 · 142 阅读 · 0 评论 -
一道经典算法题:合并两个有序链表
刚刚在Leetcode上刷到了这道题,于是我想起了一句经典名言:人在极度愤怒的情况下连简单题都做不出来!这道题在Leetcode上标注的难度是简单题,但是思考了很久也很痛苦也没想明白是咋回事。最终在耗了我一个多小时候才思考明白,基本上就是一个递归的方式,结合了链表所以显得有些简单,哈哈!思路:题解:/** * Definition for singly-linked list. * public class ListNode { * int val; * ...原创 2021-01-16 22:37:58 · 243 阅读 · 0 评论 -
从一道算法题看用空间换时间的思维方式
最近刷到了一道很好的算法题:写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:F(0) = 0, F(1)= 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。来源:力扣(LeetCode)链接:https://leetc...原创 2021-01-06 22:39:59 · 242 阅读 · 0 评论 -
Leetcode刷题16--判断能否形成等差数列
Leetcode原题:1502. 判断能否形成等差数列难度简单8给你一个数字数组 arr 。如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 。如果可以重新排列数组形成等差数列,请返回 true ;否则,返回 false 。 示例 1:输入:arr = [3,5,1]输出:true解释:对数组重新排序得到 [1,3,5] 或者 [5,3,1] ,任意相邻两项的差分别为 2 或 -2 ,可以形成等差数列。示例 2:输入:ar原创 2021-01-02 23:50:56 · 154 阅读 · 0 评论 -
Leetcode刷题15--机器人能否返回原点
Leetcode原题:657. 机器人能否返回原点难度简单184在二维平面上,有一个机器人从原点 (0, 0) 开始。给出它的移动顺序,判断这个机器人在完成移动后是否在 (0, 0) 处结束。移动顺序由字符串表示。字符 move[i] 表示其第 i 次移动。机器人的有效动作有 R(右),L(左),U(上)和 D(下)。如果机器人在完成所有动作后返回原点,则返回 true。否则,返回 false。注意:机器人“面朝”的方向无关紧要。 “R” 将始终使机器人向右移动一次,“L原创 2021-01-02 17:15:37 · 208 阅读 · 1 评论 -
Leetcode刷题13--交替位二进制数
Leetcode原题:693. 交替位二进制数难度简单给定一个正整数,检查它的二进制表示是否总是 0、1 交替出现:换句话说,就是二进制表示中相邻两位的数字永不相同。 示例 1:输入:n = 5输出:true解释:5 的二进制表示是:101示例 2:输入:n = 7输出:false解释:7 的二进制表示是:111.示例 3:输入:n = 11输出:false解释:11 的二进制表示是:1011.示例 4:输入:n = 10输出:true解释:10原创 2021-01-02 17:03:30 · 338 阅读 · 0 评论 -
异或运算
参与运算的两个值,如果两个相应bit位相同,则结果为0,否则为1。 即: 0^0 = 0, 1^0 = 1, 0^1 = 1, 1^1 = 0原创 2021-01-02 16:58:50 · 155 阅读 · 0 评论 -
Leetcode刷题12--宝石与石头
Leetcode原题:771. 宝石与石头难度简单616 给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。 S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。J 中的字母不重复,J 和 S中的所有字符都是字母。字母区分大小写,因此"a"和"A"是不同类型的石头。示例 1:输入: J = "aA", S = "aAAbbbb"输出: 3示例 2:输入: J = "z", S = "ZZ"输出: 0注意:S 和 J原创 2021-01-02 16:31:58 · 173 阅读 · 0 评论 -
Leetcode刷题11--员工的重要性
Leetcode原题:690. 员工的重要性难度简单122给定一个保存员工信息的数据结构,它包含了员工唯一的id,重要度 和 直系下属的id。比如,员工1是员工2的领导,员工2是员工3的领导。他们相应的重要度为15, 10, 5。那么员工1的数据结构是[1, 15, [2]],员工2的数据结构是[2, 10, [3]],员工3的数据结构是[3, 5, []]。注意虽然员工3也是员工1的一个下属,但是由于并不是直系下属,因此没有体现在员工1的数据结构中。现在输入一个公司原创 2021-01-02 16:22:23 · 167 阅读 · 0 评论 -
Leetcode刷题10--两数之和2-输入有序数组
LeetCode原题:两数之和 II - 输入有序数组给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。说明:返回的下标值(index1 和 index2)不是从零开始的。你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。示例:输入: numbers = [2, 7, 11, 15], target = 9输出: [1,2]解释:原创 2021-01-02 15:26:17 · 112 阅读 · 0 评论 -
Leetcode刷题09--分饼干
Leetcode原题:假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i,都有一个胃口值g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j]。如果 s[j]>= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。示例1:输入: g = [1,2,3], s = [1,1]输出: 1解释: 你有三个孩子和...原创 2020-12-12 22:33:51 · 307 阅读 · 0 评论 -
Leetcode刷题08--杨辉三角
Leetcode原题:给定一个非负整数numRows,生成杨辉三角的前numRows行。在杨辉三角中,每个数是它左上方和右上方的数的和。示例:输入: 5输出:[ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1]]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/pascals-triangle著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请...原创 2020-12-12 20:42:22 · 177 阅读 · 0 评论 -
char转换为int(小知识)
ASCII值字符值 ASCII值 ‘0’ 48 ‘9’ 57 ‘A’ 65 ‘Z’ 90 ‘a’ 97 ‘z’ 122 char a = '9';int a_int = a - '0';原创 2020-12-09 09:54:00 · 289 阅读 · 0 评论 -
Leetcode刷题07--棒球比赛
Leetcode原题:你现在是一场采特殊赛制棒球比赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表 ops,其中 ops[i] 是你需要记录的第 i 项操作,ops 遵循下述规则:整数 x - 表示本回合新获得分数 x"+" - 表示本回合新获得的得分是前两次得分的总和。题目数据保证记录此操作时前面总是存在两个有效的分数。"D" - 表示本回合新获得的得分是前一次得分的两倍。题目数据保证记录此操作时前原创 2020-11-27 00:44:52 · 350 阅读 · 0 评论 -
Leetcode刷题06--用队列实现栈
原题如下:使用队列实现栈的下列操作:push(x) -- 元素 x 入栈pop() -- 移除栈顶元素top() -- 获取栈顶元素empty() -- 返回栈是否为空注意:你只能使用队列的基本操作-- 也就是push to back, peek/pop from front, size, 和is empty这些操作是合法的。你所使用的语言也许不支持队列。你可以使用 list 或者 deque(双端队列)来模拟一个队列, 只要是标准的队列操作即可。你可以假设所有操作都是有...原创 2020-11-26 22:34:10 · 122 阅读 · 0 评论 -
Leetcode刷题05--丢失的数字
给定一个包含 [0, n]中n个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。进阶:你能否实现线性时间复杂度、仅使用额外常数空间的算法解决此问题?示例 1:输入:nums = [3,0,1]输出:2解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。示例 2:输入:nums = [0,1]输出:2解释:n = 2,因为有 2 个数字,所以所有的数字都在范...原创 2020-11-26 21:13:42 · 554 阅读 · 0 评论 -
Leetcode刷题04--图片平滑器
Leetcode原题:包含整数的二维矩阵 M 表示一个图片的灰度。你需要设计一个平滑器来让每一个单元的灰度成为平均灰度(向下舍入) ,平均灰度的计算是周围的8个单元和它本身的值求平均,如果周围的单元格不足八个,则尽可能多的利用它们。示例 1:输入:[[1,1,1], [1,0,1], [1,1,1]]输出:[[0, 0, 0], [0, 0, 0], [0, 0, 0]]解释:对于点 (0,0), (0,2), (2,0), (2,2): 平均(3/4) = 平均(0.原创 2020-11-26 11:25:22 · 152 阅读 · 0 评论 -
java中for循环i++和++i的区别
最近在刷Leetcode的时候发现for循环里面很多人在用++i实现自增,那么i++和++i到底在for循环中使用有什么区别呢?答案是没有区别!那么肯定有人会疑惑:i++是先使用i的值再自增,++i是先自增再使用自增后i的值啊!问题就出在for循环里面的执行顺序:for(A;B;C){ D;}A->B->D->C->B->D->C......原创 2020-11-26 09:59:56 · 737 阅读 · 0 评论 -
Leetcode刷题03--转置矩阵
给定一个矩阵A,返回A的转置矩阵。矩阵的转置是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。示例 1:输入:[[1,2,3],[4,5,6],[7,8,9]]输出:[[1,4,7],[2,5,8],[3,6,9]]示例 2:输入:[[1,2,3],[4,5,6]]输出:[[1,4],[2,5],[3,6]]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/transpose-matrix著作权归领扣网络所...原创 2020-11-25 23:39:11 · 286 阅读 · 0 评论 -
Leetcode刷题02--灯泡开关
初始时有n个灯泡关闭。第 1 轮,你打开所有的灯泡。 第 2 轮,每两个灯泡你关闭一次。 第 3 轮,每三个灯泡切换一次开关(如果关闭则开启,如果开启则关闭)。第i 轮,每i个灯泡切换一次开关。 对于第n轮,你只切换最后一个灯泡的开关。找出n轮后有多少个亮着的灯泡。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/bulb-switcher著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。输入...原创 2020-11-25 22:50:00 · 348 阅读 · 0 评论 -
Leetcode刷题01-- 所有蚂蚁掉下来前的最后一刻
原题:有一块木板,长度为 n 个 单位 。一些蚂蚁在木板上移动,每只蚂蚁都以 每秒一个单位 的速度移动。其中,一部分蚂蚁向 左 移动,其他蚂蚁向 右 移动。当两只向 不同 方向移动的蚂蚁在某个点相遇时,它们会同时改变移动方向并继续移动。假设更改方向不会花费任何额外时间。而当蚂蚁在某一时刻 t 到达木板的一端时,它立即从木板上掉下来。给你一个整数 n 和两个整数数组 left 以及 right 。两个数组分别标识向左或者向右移动的蚂蚁在 t = 0 时的位置。请你返回最后一只蚂蚁从木板上掉.原创 2020-11-25 22:12:11 · 308 阅读 · 0 评论 -
ArrayList源码分析
大家都知道ArrayList的底层是数组,那么ArrayList的源码是什么样的呢?我大致翻了一下ArrayList源码,不是很长,大概1500行左右,但是我们并不需要去一行一行的看,很容易云里雾里而且没有必要。我们将从ArrayList的初始化,增加和删除方法以及ArrayList的扩容来理解ArrayList的核心原理。 //默认容量 private static final int DEFAULT_CAPACITY = 10; //空数组 privat原创 2020-09-21 17:16:20 · 116 阅读 · 0 评论 -
时间复杂度
我们知道,算法中有时间复杂度这样一个概念,那么如何理解时间复杂度呢?下面举个例子:话说大数学家高斯小时候老师出了个题:1+2+3+···+100=?于是大家都认真计算起来,只有高斯不为所动,老师很诧异,问他为什么不开始计算,高斯说他算完了:1+2+3+···+100+100+99+98+···+1=101+101+···+101= 102*100/2=5050果然是天才的思路!// 通过具体的 n 的步骤就可以推演出算法的复杂度int sum1(int n){原创 2020-09-21 15:54:42 · 187 阅读 · 0 评论
分享