leetcode
记录算法刷题。
妙先森
这个作者很懒,什么都没留下…
展开
-
每日一题 字典序的第K小数字
题目题链:440. 字典序的第K小数字题解官方题解:字典序的第K小数字刚开始试了试直接遍历放到字符串数组中,然后字典排序,然后根据下标取出第k小的字符串转为整形数据,由于 1 <= k <= n <= 109 很明显是超时的。代码: class Solution02 { public int findKthNumber(int n, int k) { String[] strs = new String[n];原创 2022-03-23 21:27:49 · 448 阅读 · 0 评论 -
(每日一题 day 003 - 二维前缀和+动态规划) 1314. 矩阵区域和
文章目录题目题解解法一:暴力模拟解法二:二维前缀和题目题链:1314. 矩阵区域和题解解法一:暴力模拟直接根据题意,模拟即可,时间复杂度O(n^4)class Solution { public int[][] matrixBlockSum(int[][] mat, int k) { int m = mat.length; int n = mat[0].length; int[][] res = new int[m][n];原创 2021-10-22 16:50:33 · 101 阅读 · 0 评论 -
(每日一题 day 002 - 模拟) 166. 分数到小数
文章目录题目题解题目题链:166. 分数到小数题解使用小学数学的长除法模拟解决,分三步走:判断是否可以直接整除,可以整除直接相除返回结果即可判断符号是否一正一负,是的话转为正数进行相除、并且结果记得添上负号。小数方面的处理、使用一个hashmap判断是否存在循环小数、存在则加上括号、使用stringbulider的insert在出现重复余数的下标插入。没有最后会直接得到小数结果。需要注意的是在求余那一块可能会出现整形溢出的情况、所以改成long进行运算。class Solution原创 2021-10-03 20:50:45 · 84 阅读 · 0 评论 -
(day 001 - 进制转换) 405. 数字转换为十六进制数
文章目录题目题解解法一:模拟解法二:位运算题目题解解法一:模拟模拟起来很简单、但是负数需要处理、因为都是用补码表示、32位我们不妨直接用负数加上2^32,然后直接进行模拟即可。class Solution { public String toHex(int num) { if (num == 0){return "0";} long _num = num; if (_num < 0){ _num += Math原创 2021-10-02 23:27:45 · 279 阅读 · 0 评论 -
(day 52 - DFS) 剑指 Offer 68 - II. 二叉树的最近公共祖先
题目题链:剑指 Offer 68 - II. 二叉树的最近公共祖先添加链接描述题解K神大佬详细题解:剑指 Offer 68 - II. 二叉树的最近公共祖先(DFS ,清晰图解)本题和他的一版本不同的是这个不是排序二叉树、所以只能用DFS了。DFS时、终止条件是遍历到叶节点没找到返回null、找到了直接返回那个节点,然后回栈到上一节点的时候要加判断条件假设这个节点左右节点都不是空说明这个节点就是最近公共祖先,直接返回这个节点。假设只有左子树为空、右子树不为空说明有一个节点在这个节点的右子树原创 2021-08-30 00:08:42 · 162 阅读 · 0 评论 -
(day 52 - 二叉搜索树) 剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
题目题链:剑指 Offer 68 - I. 二叉搜索树的最近公共祖先题解官方题解:二叉搜索树的最近公共祖先解法一:两次遍历因为是一个二叉搜索树、所以可以很容易找到路径。通过记录两个节点的路径、找到分岔节点就是最近公共祖先。class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { List<TreeNode> pPath = ge原创 2021-08-29 22:29:31 · 214 阅读 · 0 评论 -
(day 52 - 递归 and 短路逻辑运算符的用法 ) 剑指 Offer 64. 求1+2+…+n
题目题链:剑指 Offer 64. 求1+2+…+n题解K神大佬详细题解:面试题64. 求 1 + 2 + … + n(逻辑符短路,清晰图解)本题的难度在于限制条件太多、说出来可能不行刚开始看成了±都不能用、所以一定要仔细审题。递归即可解决、但判断为零使用到了if这不符合题意、所以可以使用&&运算符,具体看代码。class Solution { public int sumNums(int n) { boolean a = n > 1 &&a原创 2021-08-29 17:06:28 · 119 阅读 · 0 评论 -
(day 53 - 动态规划 ) 剑指 Offer 63. 股票的最大利润
文章目录题目题解题目题链:剑指 Offer 63. 股票的最大利润题解这道题我用的是贪心、但也可以说是动态规划吧。反正就是从第一个开始遍历、每次都和下一个价格比较小于下一个单价说明涨了、则直接相减,相减值用一个变量和自己比较来维护最大利润。比下一个大就直接等于下一个。class Solution { public int maxProfit(int[] prices) { if (prices.length == 0){ return 0;原创 2021-08-29 15:47:32 · 156 阅读 · 0 评论 -
(day 52 - 约舍夫环问题 ) 剑指 Offer 62. 圆圈中最后剩下的数字
题目题链:剑指 Offer 62. 圆圈中最后剩下的数字题解经典的约瑟夫环问题K神大佬题解:剑指 Offer 62. 圆圈中最后剩下的数字(数学 / 动态规划,清晰图解)class Solution { public int lastRemaining(int n, int m) { int x = 0; for (int i = 2; i <= n; i++) { x = (x + m)%i; }原创 2021-08-28 22:16:17 · 117 阅读 · 0 评论 -
(day 52 - 先序后序遍历计数 ) 剑指 Offer 55 - II. 平衡二叉树
题目题链:剑指 Offer 55 - II. 平衡二叉树题解K神大佬详细题解:面试题55 - II. 平衡二叉树(从底至顶、从顶至底,清晰图解)解法一:先序遍历计算左右子树最大深度、然后递归判断是否子树大于1,大于1就不是平衡二叉树。class Solution { public boolean isBalanced(TreeNode root) { if (root == null){ return true; }原创 2021-08-28 17:48:24 · 154 阅读 · 0 评论 -
(day 51 - 排序+夹牌 ) 剑指 Offer 61. 扑克牌中的顺子
题目题链:剑指 Offer 61. 扑克牌中的顺子题解解法一:遍历+排序+标记遍历一遍先把大小王求出来、然后再从除去大小王的索引处开始遍历。flage-nums[i+1] - nums[i]) + 1表示的是大小王的数量、假设相邻的数相差的数大于大小王的总数量那么一定无法构成顺子那么相减之后flag肯定是小于0,temp>flag是防止有重复元素出现。class Solution { public boolean isStraight(int[] nums) { A原创 2021-08-27 16:03:51 · 179 阅读 · 0 评论 -
(day 51 - 字符转化为数字 ) 剑指 Offer 67. 把字符串转换成整数
题目题链:剑指 Offer 67. 把字符串转换成整数题解K神大佬详细题解:面试题67. 把字符串转换成整数(数字越界处理,清晰图解)题目怎么说呢、难度在于很麻烦,要仔细。大概步骤:先去除两边空格、转化为字符数组再判断字符数组是否为0、为0直接返回0再设置一个变量sign表示正负判断第一是否为正负字符、为﹣就将sign改为-1、且将开始遍历的索引改为1然后开始遍历、先判断是否为数字、不是直接返回0再判读是否超过最大值、超过根据符号±直接返回都不满足5、6条件就是进行拼接了最后遍原创 2021-08-27 14:34:16 · 129 阅读 · 0 评论 -
(day 50 - 动态规划+概率论 ) 剑指 Offer 60. n个骰子的点数
题目题链:剑指 Offer 60. n个骰子的点数题解自己很菜、看到这道题是一脸懵的、看了题解才知道怎么去做。K神详细题解:剑指 Offer 60. n 个骰子的点数(动态规划,清晰图解)class Solution { public double[] dicesProbability(int n) { double[] res = new double[6]; Arrays.fill(res,1.0/6.0); for (int i =原创 2021-08-26 14:29:02 · 145 阅读 · 0 评论 -
(day 49 - 另起数组牺牲空间换取时间 ) 剑指 Offer 66. 构建乘积数组
题目题链:剑指 Offer 66. 构建乘积数组题解题目规定了不能使用除法、这样的话i后面的数值的乘积可使用遍历了直接求出来解法一:三指针暴力解法这种解法是简单暴力、但时间负责度为O(n2),根据题目的数据规模10万果不其然会超时。class Solution { public int[] constructArr(int[] a) { int i = 0 , j = 0, k = 1 ; int[] res = new int[a.length];原创 2021-08-25 17:32:09 · 113 阅读 · 0 评论 -
(day 48 - 双端队列的使用 ) 剑指 Offer 59 - II. 队列的最大值
题目题链:剑指 Offer 59 - II. 队列的最大值题解K神详细题解:剑指 Offer 59 - II. 队列的最大值(单调双向队列,清晰图解)队列的push和pop实现O(1)复杂度使用普通的单向队列就行了、但这个max的求解需要使用到双端队列deque。我们可以使用双端队列实现max的维护、当有新的值进入时把小于新值的元素poll掉,然后再push进去。poll元素时当polld的元素等于当前deque的队首时要poll掉维护最大值的元素。deque的使用:java关于Deque的使用原创 2021-08-24 21:44:24 · 167 阅读 · 0 评论 -
(day 47 - 位运算 ) 剑指 Offer 65. 不用加减乘除做加法
题目题链:剑指 Offer 65. 不用加减乘除做加法题解K神详细题解:面试题65. 不用加减乘除做加法(位运算,清晰图解)题目明显要求不能用算术运算符、那么只能通过位运算解了。无论什么加法运算都分为两种情况进位和不进位、10机制的加法中假设8+5这里加的时候个位会有3,进位是1但我们会向左移一位变成10然后再用10+3就等于13这次没有发生进位。二进制中的运算也是如此。在二进制中不进位时是用异或运算,进位使用且&运算。因为只有1+1才会进位其他1+0,0+1,0+0都是不会发生进位恰原创 2021-08-23 13:44:01 · 172 阅读 · 0 评论 -
(day 46 - 小根堆 || 动态规划 ) 剑指 Offer 49. 丑数
题目题链:剑指 Offer 49. 丑数题解官方题解:丑数解法一:小根堆第一个数是1、后面就是每次使用2、3、5乘以当前最小的数即可。比如先是1,使用2,3,5乘后小根堆里就有1、2、3、5,然后再用2乘以2、3、5就是有1、2、3、5、4、6、10因为是使用小根堆存的所以会自动排好序,但有可能出现重复的数、所以我们可以使用hash去重、每次添加的时候判断这个元素有没有重复。class Solution { public int nthUglyNumber(int n) {原创 2021-08-22 21:42:36 · 126 阅读 · 0 评论 -
(day 45 - 中序遍历 ) 剑指 Offer 54. 二叉搜索树的第k大节点
题目题链:剑指 Offer 54. 二叉搜索树的第k大节点题解很明显这题一看就会想到中序遍历、但这个是从大到小的遍历,所以遍历顺序是右 -> 中 -> 左。解法一:中序遍历+列表自己先是使用了一个额外列表直接将遍历完的数字添加到列表中然后直接根据索引得出结果。这种时间负责度和空间复杂均为O(n)。class Solution { private ArrayList<Integer> res = new ArrayList<>(); publ原创 2021-08-21 21:29:27 · 153 阅读 · 0 评论 -
(day 44 - 滑动窗口 ) 剑指 Offer 53 - II. 0~n-1中缺失的数字
题目题链:剑指 Offer 53 - II. 0~n-1中缺失的数字题解K神大佬详细题解:面试题48. 最长不含重复字符的子字符串(动态规划 / 双指针 + 哈希表,清晰图解)public int lengthOfLongestSubstring02(String s) { int i = -1,res = 0; HashMap<Character,Integer> map = new HashMap<>(); for (int j = 0; j &原创 2021-08-20 22:52:44 · 88 阅读 · 0 评论 -
(day 43 - 二分查找 ) 剑指 Offer 53 - II. 0~n-1中缺失的数字
题目题链:剑指 Offer 53 - II. 0~n-1中缺失的数字题解解法一:暴力遍历public int missingNumber(int[] nums) { int n = nums.length; for (int i=0;i<n;i++){ if (i != nums[i]){ return i; } } return n;}解法二:二分查找看见有序数组的首先应该想到的是二分查找pu原创 2021-08-19 22:13:43 · 89 阅读 · 0 评论 -
(day 42 - 字符翻转 ) 剑指 Offer 58 - II. 左旋转字符串
题目题链: 剑指 Offer 58 - II. 左旋转字符串题解这题解法很多种、切片、遍历都可以。其中有一种比较有意思的是翻转三次解法一:遍历拼接这种方法时间和空间负责度均为O(n)class Solution { public String reverseLeftWords(String s, int n) { StringBuilder sb = new StringBuilder(); for (int i = n; i < s.length原创 2021-08-18 15:53:56 · 301 阅读 · 0 评论 -
(day 41 - 二分查找) 剑指 Offer 53 - I. 在排序数组中查找数字 I
题目题链:剑指 Offer 53 - I. 在排序数组中查找数字 I题解两种解法第一种最最显而易见的就是直接遍历计数暴力解决、第二种就是二分法降低时间复杂度。解法一:暴力遍历遍历完整个数组即可、时间复杂度为O(n),空间复杂度为O(1)class Solution { public int search(int[] nums, int target) { int res = 0; for(int i = 0;i < nums.length ; i+原创 2021-08-17 11:43:06 · 134 阅读 · 0 评论 -
(day 40 - 双指针+库函数) 剑指 Offer 58 - I. 翻转单词顺序
题目题链:剑指 Offer 58 - I. 翻转单词顺序题解解法一:纯库函数使用split("[ ]+")切割分成字符串数组、然后再遍历拼接、最后使用trim()去掉两边的空格即可。public static String reverseWords(String s) { String[] cs = s.split("[ ]+"); StringBuilder sb = new StringBuilder(); for (int i = cs.length-1; i &g原创 2021-08-16 14:36:52 · 87 阅读 · 0 评论 -
(day 39 - 动态规划) 剑指 Offer 47. 礼物的最大价值
题目题链:剑指 Offer 47. 礼物的最大价值题解看到题呢题目说要用动态规划、我用了dfs去解果不其然超时了。class Solution { private int maxValue = 0; public int maxValue(int[][] grid) { dfs(grid,0,0,0); return maxValue; } void dfs(int[][] grid,int r,int l,int cur){原创 2021-08-15 16:31:20 · 107 阅读 · 0 评论 -
(day 38 - 双指针) 剑指 Offer 52. 两个链表的第一个公共节点
题目题链:剑指 Offer 52. 两个链表的第一个公共节点题解本题使用双指针、A = headA,B = headB,假设C为相交的公共节点长度为c。A,B长度分别为a,b,很容易发现a+(b-c) = b+(a-c)。a+(b-c)为A节点走完了A节点后再去走B节点直到走到第一个公共节点。b+(a-c)为B节点走完了B节点后再去走A节点直到走到第一个公共节点。有一个浪漫的说法就是“我变成你,走你走过的路。你变成我,走我走过的路。然后我们相遇了”可以完美的映射本题的解题思路。所以有代码原创 2021-08-14 19:58:05 · 121 阅读 · 0 评论 -
(day 37 - 动态规划)剑指 Offer 46. 把数字翻译成字符串
题目题链:剑指 Offer 46. 把数字翻译成字符串题解看到这个题知道是用动态规划、但就是不知道怎么找递推式和状态、动态规划还是得多刷。K神大佬题解:面试题46. 把数字翻译成字符串(动态规划,清晰图解)class Solution { public int translateNum(int num) { String str = String.valueOf(num); int a=1,b=1,c=1; for (int原创 2021-08-13 22:13:19 · 120 阅读 · 0 评论 -
(day 36 - 滑动窗口)剑指 Offer 57 - II. 和为s的连续正数序列
题目题链:剑指 Offer 57 - II. 和为s的连续正数序列题解大佬视频讲解:Java 滑动窗口 典型框架 视频讲解滑动窗口文字详细讲解:什么是滑动窗口,以及如何用滑动窗口解这道题(C++/Java/Python)之前没了解过什么是滑动窗口、看了题解才知道本质上就是双指针。class Solution { public int[][] findContinuousSequence(int target) { int l=1,r=2,sum=3; List<原创 2021-08-12 21:43:43 · 125 阅读 · 0 评论 -
(day 35 - 自定义排序规则 )剑指 Offer 45. 把数组排成最小的数
题目题链:剑指 Offer 45. 把数组排成最小的数题解k神详细题解:剑指 Offer 45. 把数组排成最小的数(自定义排序,清晰图解)本题其实就是排序、没有使用过自定义的排序函数和字符串专属的比较函数compareTo是很难解出来的。Java compareTo() 方法(菜鸟教程)方法一:自己写排序算法、快速排序快排模板class Solution { // 自定义快排 public String minNumber(int[] nums) {原创 2021-08-11 15:03:40 · 139 阅读 · 0 评论 -
(day 34 - 哈希表 or 双指针 )剑指 Offer 57. 和为s的两个数字
题目题链:剑指 Offer 57. 和为s的两个数字题解大佬详细题解:面试题57. 和为 s 的两个数字(双指针 + 证明,清晰图解)最简单的就是暴力解法、直接双重循环、显然时间复杂度是O(n^2)是不可取的。使用哈希表稍微好点,由于数组是有序序列、所以我们可以使用双指针一个在前一个在后。解法一:使用哈希表public int[] twoSum02(int[] nums, int target) { HashMap<Integer,Integer> map = new H原创 2021-08-10 15:13:37 · 115 阅读 · 0 评论 -
(day 33 - 位运算 )剑指 Offer 56 - II. 数组中数字出现的次数 II
题目题链:剑指 Offer 56 - II. 数组中数字出现的次数 II题解参考的K大佬题解:面试题56 - II. 数组中数字出现的次数 II(位运算 + 有限状态自动机,清晰图解)题目给的条件是一个数组中只有一个单个数、其它都是3个数。和I不同的是这里是三个数一起、使用异或明显行不通了。如下图所示,考虑数字的二进制形式,对于出现三次的数字,各二进制位出现的次数都是3的倍数。因此,统计所有数字的各二进制位中1的出现次数,并对3求余,结果则为只出现一次的数字。所以我们可以用一个长度为32的原创 2021-08-09 18:07:11 · 152 阅读 · 0 评论 -
(day 32 - 位运算 )剑指 Offer 56 - I. 数组中数字出现的次数
题目题链:剑指 Offer 56 - I. 数组中数字出现的次数题解原创 2021-08-08 22:23:43 · 135 阅读 · 0 评论 -
(day 30 - 二叉树的先序遍历 )剑指 Offer 55 - I. 二叉树的深度
题目题链:剑指 Offer 55 - I. 二叉树的深度题解看到题我想到的是使用递归、每遍历一个节点就用一个变量计数加一、等到了最后叶子节点表示已经遍历到最底部、然后用一个外部记录每个根节点深度的变量来找出最大深度的叶子节点。使用的是先序遍历的思想。题解有后序遍历、和层遍历的题解。大佬详细题解:面试题55 - I. 二叉树的深度(后序遍历、层序遍历,清晰图解)class Solution { private int max = 0; public int maxDepth(T原创 2021-08-07 14:05:21 · 169 阅读 · 0 评论 -
(day 29 - 二叉树的先序遍历 )剑指 Offer 34. 二叉树中和为某一值的路径
题目题链:剑指 Offer 34. 二叉树中和为某一值的路径题解先序遍历+回溯、找到满足条件的路径,注意的是添加结果结合的时候要新建一个集合。大佬详细题解:面试题34. 二叉树中和为某一值的路径(回溯法,清晰图解)/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNo原创 2021-08-06 14:16:20 · 147 阅读 · 0 评论 -
(day 28 - 哈希表 )剑指 Offer 50. 第一个只出现一次的字符
题目题链:剑指 Offer 50. 第一个只出现一次的字符题解哈希表、字符做键、boolea类型做值。class Solution { public char firstUniqChar(String s) { char[] chars = s.toCharArray(); Map<Character,Boolean> map = new HashMap<>(); for (char c : chars) {原创 2021-08-05 20:46:20 · 110 阅读 · 0 评论 -
(day 27 - 递归分治 )剑指 Offer 33. 二叉搜索树的后序遍历序列
题目题链:剑指 Offer 33. 二叉搜索树的后序遍历序列题解本题的关键是要知道后序遍历的特点是根节点是在最后一个输出的、假设序列长度为n,也就是说根节点的下标就是n-1,在后续遍历的序列中从第一个元素开始直到找到的第一个比最后一个元素根节点大的元素是左右子树的分界点、设这个节点的索引为m,则0到m-1都是属于根节点的左子树、m到n-1-1都是右子树。明白了后续遍历的特点之后、使用递归来处理相同的子问题。大佬详细题解:面试题33. 二叉搜索树的后序遍历序列(递归分治 / 单调栈,清晰图解)c原创 2021-08-04 16:02:04 · 180 阅读 · 0 评论 -
B树和B+树
结合这几篇文章可以对B树B+树有一定的了解。简书:数据结构之B树与B+树b树和b+树区别_一点微小的改动,让你从B树理解到B+树从B树、B+树、B*树谈到R 树原创 2021-08-04 01:23:27 · 76 阅读 · 0 评论 -
(day 26 - 广度优先搜索 )剑指 Offer 32 - III. 从上到下打印二叉树 III
题目题链:剑指 Offer 32 - III. 从上到下打印二叉树 III题解和前面的1,2一样都要用到bfs、然后按层遍历、不同的是这个加了左右方向。加个双端队列也就是使用Linkedlist就能解决。大佬详细题解:面试题32 - III. 从上到下打印二叉树 III(层序遍历 BFS / 双端队列,清晰图解)/** * Definition for a binary tree node. * public class TreeNode { * int val; * T原创 2021-08-03 23:06:45 · 139 阅读 · 0 评论 -
(day 25 - 广度优先搜索 )剑指 Offer 32 - II. 从上到下打印二叉树 II
题目题链:剑指 Offer 32 - II. 从上到下打印二叉树 II题解广度优先遍历、加一个循环分层。大佬详细题解:剑指 Offer 32 - II. 从上到下打印二叉树 II/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val =原创 2021-08-02 15:06:42 · 147 阅读 · 0 评论 -
(day 24 - 广度优先搜索 )剑指 Offer 32 - I. 从上到下打印二叉树
题目题链:剑指 Offer 32 - I. 从上到下打印二叉树题解典型的广度优先搜索。大佬详细题解:剑指 Offer 32 - I. 从上到下打印二叉树/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val = x; }* }*/class S原创 2021-08-01 15:18:33 · 99 阅读 · 0 评论 -
(day 23 - 中位数 投票法 )剑指 Offer 39. 数组中出现次数超过一半的数字
题目题链:剑指 Offer 39. 数组中出现次数超过一半的数字题解官方题解:数组中出现次数超过一半的数字有三种解法、最优算法是投票法:HashMap解法很简单就是遍历数组中的元素添加到map中如果已存在这个元素就+1,不存在初始值设为0,遍历完之后再遍历hashmap找出value值大于数组长度一半的元素。class Solution { public int majorityElement(int[] nums) { if (nums.length == 1){原创 2021-07-31 21:29:34 · 226 阅读 · 0 评论
分享