
【算法】
算法
晓风残月一望关河萧索
志存高远,脚踏实地。
路漫漫其修远兮,吾将上下而求索。
展开
-
【详解】MD5加密真的安全吗?不安全有什么解决办法?
1、MD5加密简介在用户注册是时候,通常使用MD5加密,先看下什么是MD5加密,以及加密过程?MD5全名Message-Digest Algorithm 5(信息-摘要算法)是一种不可逆的加密算法。2、MD5有以下特性:压缩性:任意长度的数据,算出的MD5值长度都是固定的。容易计算:从原数据计算出MD5值很容易。抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。弱抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困原创 2022-05-10 10:37:15 · 3027 阅读 · 0 评论 -
【打卡第259道】【二分】【leetCode高频】:34. 在排序数组中查找元素的第一个和最后一个位置
1、题目描述给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。进阶:你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?2、算法分析本题的数组为升序数组,使用二分查找解决此问题。明确几个点:1、找左半边的位置①二分查找的范围:左边界left = 0,有边界right=nums.length - 1②假如数组中存在targe原创 2022-05-06 18:17:34 · 208 阅读 · 0 评论 -
【打卡第258道】【字符串】【leetCode高频】:8. 字符串转换整数 (atoi)
1、题目描述请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。函数 myAtoi(string s) 的算法如下:读入字符串并丢弃无用的前导空格检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。将前面步骤读入的这些数字转换为整数(即原创 2022-05-04 16:47:44 · 2057 阅读 · 0 评论 -
【打卡第257道】【数组】【leetCode高频】:55. 跳跃游戏
1、题目描述给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。2、算法分析这个题是判断是够能够达到数组的最后一个元素。思路:①遍历数组中的每一个元素②定义每一个元素可以跳跃的最远距离,在最远距离区间内,距离都可以达到。不断的更新最远距离③判断当前下标和最远距离的大小,如果i > maxLen的话,说明达不到最后一个元素位置。3、代码实现/**原创 2022-05-04 15:25:25 · 1225 阅读 · 0 评论 -
【打卡第256道】【数组】【leetCode高频】:6. Z 字形变换
1、题目描述将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:2、算法分析1 1 11 1 1 1 11 1 1这样看,Z往左旋转90度就是题目中说的Z字形。字符串s按照题目中给的numRows每行打印,然后返回结果。思路:①字符串s从0到numRows - 1,然后在从numRows - 1到...原创 2022-05-03 21:34:16 · 604 阅读 · 0 评论 -
【打卡第255道】【dp】【leetCode高频】:300. 最长递增子序列
1、题目描述给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。2、算法分析这题很容易想到是dp思想,当前状态是上一个状态推到出来的。动态规划以下步骤:①dp[i]含义:表示以nums[i]为结尾的最长升序子序列的长度。②初始化数组:因为每一个数组元素都可以是一个单独的序列,所以:dp[i] =原创 2022-04-28 20:34:42 · 247 阅读 · 0 评论 -
【打卡第254道】【栈】【leetCode高频】:32. 最长有效括号
1、题目描述给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。2、算法分析这题栈是最容易想到的办法。①对于遇到的每个‘(’ ,我们将它的下标放入栈中②对于遇到的每个‘)’ ,我们先弹出栈顶元素表示匹配了当前右括号:如果栈为空,说明当前的右括号为没有被匹配的右括号,我们将其下标放入栈中来更新我们之前提到的「最后一个没有被匹配的右括号的下标」如果栈不为空,当前右括号的下标减去栈顶元素即为「以该右括号为结尾的最长...原创 2022-04-08 19:30:18 · 323 阅读 · 0 评论 -
【打卡第253道】【二维数组】【leetCode高频】:54. 螺旋矩阵
1、题目描述2、算法分析首先设定矩阵的上下左右的边界。每遍历一行或者一列,删除这一行或者这一列。如果左右边界,或者上下边界越界,说明是最后一列或者最后一行。3、代码实现class Solution { public List<Integer> spiralOrder(int[][] matrix) { List<Integer> res = new ArrayList<>(); int up = .原创 2022-04-08 11:52:36 · 403 阅读 · 0 评论 -
【打卡第252道】【链表】【leetCode高频】:25. K 个一组翻转链表
1、题目描述给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。进阶:你可以设计一个只使用常数额外空间的算法来解决此问题吗?你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。2、算法分析首先这个是一个反转链表,反转链表很简单了,只需要修改链表的指针方向就可以了。问题是怎么区间范围内翻转链表。1、链表分区为已翻转部分+待翻转部分+.原创 2022-04-06 21:15:04 · 168 阅读 · 0 评论 -
【详解】【技巧】计算二进制1的个数:x=x &x-1
计算二进制位1的个数:n=n&(n-1),每执行一次x = x&(x-1),会将x用二进制表示时最右边的一个1变为0,因为x-1将会将该位(x用二进制表示时最右边的一个1)变为0。详见这一题:力扣public int hammingWeight(int n) { int count = 0; while(n != 0){ count++; n = n & (n - 1); ...原创 2022-04-05 23:17:54 · 508 阅读 · 0 评论 -
【打卡第251道】【质数】【leetCode高频】:204. 计数质数
1、题目描述给定整数 n ,返回 所有小于非负整数 n 的质数的数量 。2、算法分析这个方法记住即可,这是一个古老的筛素数的方法。初始化长度 O(n)O(n) 的标记数组,表示这个数组是否为质数。数组初始化所有的数都是质数.从 2 开始将当前数字的倍数全都标记为合数。标记到 \sqrt{n} ,n时停止即可。3、代码实现class Solution { public int countPrimes(int n) { boolean[] ..原创 2022-04-05 23:10:16 · 673 阅读 · 0 评论 -
【打卡第250道】【二分】【leetCode高频】:剑指 Offer 11. 旋转数组的最小数字
1、题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为 1。注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。原创 2022-04-05 21:15:21 · 157 阅读 · 0 评论 -
【打卡第249道】【01背包打家劫舍】【leetCode高频】:198. 打家劫舍
1、题目描述你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。2、算法分析动态规划,这次状态由上一个状态推导出来。不能有相邻的。偷第i个房屋的财产:dp[i] 由dp[i - 2] + nums[i];偷第i - 1个访问的财产,dp[i]原创 2022-04-05 16:58:48 · 203 阅读 · 0 评论 -
【打卡第248道】【堆排序应用】【leetCode高频】:215. 数组中的第K个最大元素
1、题目描述给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。2、算法分析这题使用优先级队列比较好写点。知识补充:优先队列PriorityQueue是Queue接口的实现,可以对其中元素进行排序,可以放基本数据类型的包装类(如:Integer,Long等)或自定义的类。对于基本数据类型的包装器类,优先队列中元素默认排列顺序是升序排列。但对于自己定义的类来说,需要自己定义比较器。原创 2022-04-03 14:56:05 · 619 阅读 · 0 评论 -
小红书后端实习算法:【打卡第247道】【数组映射hard】【leetCode高频】:41. 缺失的第一个正数
1、题目描述给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。2、算法分析题目要求的是没有出现在nums数组里面的最小的正整数,数组是无序的。这题难就难在:实现时间复杂度为O(n)并且只使用常数级别额外空间的解决方案。而要找的数一定在 [1, N + 1] 左闭右闭(这里 N 是数组的长度)这个区间里。因此,我们可以就把原始的数组当做哈希表来使用。事实上,哈希表其实本身也是一个数组..原创 2022-04-02 23:30:28 · 707 阅读 · 0 评论 -
【打卡第246道】【动态规划hard】【leetCode高频】:72. 编辑距离
1、题目描述给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符2、算法分析这题的难度比较大。因为下一个状态是有上一个推到出来的。使用dp解决。首先说说dp数组的插入、删除、替换的的操作含义:dp[i - 1][j - 1]:表示替换操作,表示word1的前i-1个字符转换成word2的前j-1个字符,word1的第i个字符替换word2的第j个原创 2022-04-02 11:05:02 · 1013 阅读 · 0 评论 -
【打卡第245道】【动态规划】【leetCode高频】:152. 乘积最大子数组
1、题目描述给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。测试用例的答案是一个 32-位 整数。子数组 是数组的连续子序列。2、算法分析求数组中子区间的最大乘积,对于乘法,我们需要注意,负数乘以负数,会变成正数,所以解这题的时候我们需要维护两个变量,当前的最大值,以及最小值,最小值可能为负数,但没准下一步乘以一个负数,当前的最大值就变成最小值,而最小值则变成最大值了。maxDP[i + 1] =原创 2022-04-01 21:56:26 · 677 阅读 · 0 评论 -
【打卡第244道】【二分】【leetCode高频】:278. 第一个错误的版本
1、题目描述你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。2、算法分原创 2022-04-01 11:05:32 · 149 阅读 · 0 评论 -
【后端研发笔试】3.25号 阿里巴巴笔试题
直接模拟吧 。知识点补充判断是否为大小写字母:Character.isLetter(String s)关于Scanner得输入输出,请访问:代码实现:package acm;import java.util.*;/** * 3.25阿里笔试 * Question1:easy * */public class Main1 { public static void main(String[] args) { Scanner scanne...原创 2022-03-29 22:43:21 · 729 阅读 · 3 评论 -
【打卡第243道】【二叉树】【剑指Offer】:JZ8 二叉树的下一个结点
1、题目描述2、算法分析既然是找中序遍历的某一个结点的下一个结点,其实思路已经很明确了。 1、将二叉树中序遍历,存储到集合中。前提,首先找到根节点。根节点可以根据指向父节点的next指针找到。 2、找到根节点后,遍历集合,找到pNode == list.get(i),的那个元素。注意: 如果pNode是最后一个元素的话,下一个元素肯定为null; 如果pNode不是最后一个元素,返回list,get(i+1)3、代码实现/*public ...原创 2022-03-27 16:49:08 · 991 阅读 · 0 评论 -
【打卡第242道】【动态规划DP01背包】【leetCode高频】:494. 目标和
1、题目描述给你一个整数数组 nums 和一个整数 target 。向数组中的每个整数前添加 '+' 或 '-' ,然后串联起所有整数,可以构造一个 表达式 :例如,nums = [2, 1] ,可以在 2 之前添加 '+' ,在 1 之前添加 '-' ,然后串联起来得到表达式 "+2-1" 。返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。2、算法分析本题可以使用动态规划01背包解题求得是不同符合条件得表达式得数目。数组...原创 2022-03-26 19:25:55 · 177 阅读 · 0 评论 -
【打卡第241道】【动态规划DP01背包】【leetCode高频】:1049. 最后一块石头的重量 II
1、题目描述有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:如果x == y,那么两块石头都会被完全粉碎;如果x != y,那么重量为x的石头将会完全粉碎,而重量为y的石头新重量为y-x。最后,最多只会剩下一块 石头。返回此石头 最小的可能重量 。如果没有石头剩下,就返回 0。2、算法分析...原创 2022-03-25 19:19:26 · 226 阅读 · 0 评论 -
【打卡第240道】【动态规划DP01背包】【leetCode高频】:416. 分割等和子集
1、题目描述给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。2、算法分析这个是一道经典的01背包题目。注意:01背包的题目是解决的是元素只能使用一次的情况。思路:题目中说,nums数组中分成两个子集,并且两个子集的和是相等的。那么这样,背包的容量是数组一半的和。如果总和是奇数,则返回false;加下来就是dp的处理1、定义dp数组int [] dp = new int[sum / 2 + 1原创 2022-03-24 22:22:05 · 753 阅读 · 0 评论 -
【打卡第240道】【链表】度小满面试题:82. 删除排序链表中的重复元素 II
朋友面的,这儿记录下。这个题刚开始有点卡克,算法还是不怎么样。可能好久没做链表了吧。1、题目描述给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。2、算法分析这儿是删除的链表中重复的元素。这儿可以采取一个措施。①使用虚结点dummy,方便最后链表返回②只需要判断当前结点的下一个结点和下下一个结点是否相等 若相等,并记录下当前结点的下一个结点值(也就是相等的结点值)。使用w...原创 2022-03-14 17:01:38 · 668 阅读 · 0 评论 -
【打卡第239道】【二叉树】【leetCode高频】:113. 路径总和 II
1、题目描述给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。2、算法分析肯定会使用DFS(深度优先搜索)。根节点到叶子结点的路径。并且在路径上二叉树结点的值的和等于targetSum。参数:root,taget,结果集,路径集先判断只有根节点的情况,如果根节点等于target的值,直接返回根节点。如果root.left不为null,那么递归,并且里面的参原创 2022-03-07 16:46:57 · 311 阅读 · 0 评论 -
【打卡第238道】【二叉树】【leetCode高频】:513. 找树左下角的值
1、题目描述给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。假设二叉树中至少有一个节点。2、算法分析这题可以使用BFS,也就是层次遍历。思路如下:使用队列对二叉树进行层次遍历,注意最关键的是找到最后一层,当count(层次遍历的深度)等于二叉树的最大深度的时候,队列中出队的第一个元素就是最底层,最左边的元素值。看代码注释详细:3、代码实现/** * Definition for a binary tree node. * publ原创 2022-03-07 15:43:40 · 7988 阅读 · 2 评论 -
【打卡第237道】【二叉树】【leetCode高频】:701. 二叉搜索树中的插入操作
1、题目描述给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。2、算法分析一般的话,二叉搜索树中的元素没有重复的。思路:①如果根节点为空的话,直接新建一个结点②如果根节点的值小于val,那么root.right=insertInt..原创 2022-02-28 13:59:09 · 2956 阅读 · 0 评论 -
【打卡第236道】【二叉树】【leetCode高频】:700. 二叉搜索树中的搜索
1、题目描述给定二叉搜索树(BST)的根节点 root 和一个整数值 val。你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。2、算法分析查找二叉搜索树(BST)中是否存在val 目标值。如果root == val ,返回root如果root.val< val,说明val可能在右子树的范围如果root.val > val,说明val可能在左子树的范围。如果最后找不到,返回Null;3、原创 2022-02-28 13:42:40 · 4264 阅读 · 0 评论 -
【打卡第235道】【二叉树】【leetCode高频】:98. 验证二叉搜索树
1、题目描述给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下:节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。2、算法分析首先说下二叉搜索树的定义:①根结点左孩子的值均小于根节点的值②根节点右孩子的值均大于根结点的值③左右孩子结点也是一样的规则本题思路:根据二叉搜索树的规则,说明根结点的左子树的值始终是小于根结点的,右子树的值始终是大于右结原创 2022-02-28 13:32:29 · 3694 阅读 · 0 评论 -
【打卡第234道】【二叉树】【leetCode高频】:100. 相同的树
1、题目描述给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。2、算法分析思路:判断两个二叉树是否为相同的二叉树。判断根节点是否为null:注意:|| 是包含 && 的。|| 只要判断一段是否为Null,为Null的就false。而&&判断两端,两端都为true的时候才返回true,否则返回false;①判断根节点是否都为Null②判断根节点原创 2022-02-28 11:03:19 · 1728 阅读 · 0 评论 -
【打卡第233道】【二叉树】【leetCode高频】:101. 对称二叉树
1、题目描述给你一个二叉树的根节点 root , 检查它是否轴对称。2、算法分析对称的二叉树。思路:①根节点为null,返回true②左孩子为Null 且右孩子为Null,返回true③左孩子为Null 或者 右孩子为Null,返回false④判断左右孩子的值是否相等3、代码实现/** * Definition for a binary tree node. * public class TreeNode { * int val; * .原创 2022-02-28 10:07:32 · 240 阅读 · 0 评论 -
【打卡第232道】【二叉树】【leetCode高频】:226. 翻转二叉树
1、题目描述给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。2、算法分析思路一:①翻转根结点的左右孩子结点②分别递归左右孩子结点的子孩子结点思路二:使用BFS交换结点直接看代码3、代码实现方法一:递归/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * T..原创 2022-02-28 09:40:11 · 2903 阅读 · 0 评论 -
【打卡第231道】【二叉树】【leetCode高频】:111. 二叉树的最小深度
1、题目描述给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。2、算法分析最小深度,使用层次遍历。当node.left == null && node.right == null的时候,说明为最小的深度。3、代码实现/** * Definition for a binary tree node. * public class TreeNode { * int val;原创 2022-02-28 09:03:36 · 137 阅读 · 0 评论 -
【打卡第230道】【二叉树】【leetCode高频】:104. 二叉树的最大深度
1、题目描述给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。2、算法分析本题使用的是递归,对二叉树的左孩子结点递归;对二叉树的右孩子结点进行递归。使用Math.max(a,b)比较一下最大值。最后别忘记+1,要加上根结点。其实层次遍历也是可以的,但是效率比较低。3、代码实现/** * Definition for a binary tree node. * public class原创 2022-02-27 17:58:13 · 140 阅读 · 0 评论 -
【打卡第229道】【二叉树】【leetCode高频】:429. N 叉树的层序遍历
1、题目描述给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。2、算法分析这个也是和二叉树的层次遍历一样。只是这是个N叉树的遍历。3、代码实现/*// Definition for a Node.class Node { public int val; public List<Node> children; public Node() {}原创 2022-02-25 20:16:36 · 124 阅读 · 0 评论 -
【打卡第228道】【二叉树】【leetCode高频】:637. 二叉树的层平均值
1、题目描述2、算法分析还是层次遍历,使用队列获取每一层的结点值。将计算后得结果添加到List集合中。3、代码实现/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.va.原创 2022-02-25 18:36:22 · 510 阅读 · 0 评论 -
【打卡第227道】【二叉树】【leetCode高频】:199. 二叉树的右视图
1、题目描述2、算法分析使用层次遍历的方式,每层我们只需要取最后一个结点即可。直接上代码3、代码实现/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = va原创 2022-02-25 18:15:34 · 539 阅读 · 0 评论 -
【打卡第226道】【二叉树非递归(迭代)遍历】【leetCode高频】:94. 二叉树的中序遍历;144. 二叉树的前序遍历;145. 二叉树的后序遍历
1、题目描述①前序②中序③后续3、分析二叉树的非递归遍历采用的栈进行操作来存储元素。①前序:前序遍历的顺序是 中-左-右。将root元素存储到栈中,当栈不为空的时候,出栈元素,将出栈的元素添加到结果集中,所以现在只需要看左右结点的顺序。因为栈存储是先进后出的。存储顺序是:右-左;出栈元素顺序是:左-右。②中序:中序遍历的顺序是 左-中-右定义指针访问结点,左结点一直遍历到底部。将访问到的结点放进栈中。看代码,代码比较清晰。③后序...原创 2022-02-24 22:16:41 · 137 阅读 · 0 评论 -
【打卡第225道】【数组】【leetCode高频】:48. 旋转图像
1、题目描述给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。2、算法分析本题是将n * n的二维矩阵,将图像进行旋转90度,原地旋转。思路:以左上——右下对角线为轴做为斜对角线做翻转,再以中心的竖线为轴作为翻转,就可以将图像翻转90度。时间复杂度是O(n^2),因为是二维数组的操作,需要两个for循环。注意:斜对..原创 2022-02-21 17:58:13 · 443 阅读 · 0 评论 -
【打卡第224道】【字符串】【leetCode高频】:165. 比较版本号
1、题目描述给你两个版本号 version1 和 version2 ,请你比较它们。版本号由一个或多个修订号组成,各修订号由一个 '.' 连接。每个修订号由 多位数字 组成,可能包含 前导零 。每个版本号至少包含一个字符。修订号从左到右编号,下标从 0 开始,最左边的修订号下标为 0 ,下一个修订号下标为 1 ,以此类推。例如,2.5.33 和 0.1 都是有效的版本号。比较版本号时,请按从左到右的顺序依次比较它们的修订号。比较修订号时,只需比较 忽略任何前导零后的整数值 。也就是说,修订号 1原创 2022-02-17 21:35:47 · 198 阅读 · 0 评论