![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LeetCode
童话ing
放弃不难,但坚持一定很酷。
展开
-
【LeetCode】LCR 124. 推理二叉树
思路:有前备知识我们很快能发现,先序主要作用是确定根,先序中的每个节点都会顺序的成为从上往下的子树的根节点;而通过先序中确定的根节点,在中序序列中,我们能够将二叉树进行初步划分左右子树,然后继续找先序中的根,继续划分左右子树,划分这个过程可以借助递归完成。这样,在找寻到一个根节点的时候,通过这个根节点所在中序中的位置确定下一次划分的区间。:某二叉树的先序遍历结果记录于整数数组 preorder,它的中序遍历结果记录于整数数组 inorder。原创 2024-06-16 17:14:45 · 306 阅读 · 1 评论 -
【LeetCode】191. 位1的个数
也很简单的思路,就是直接计算这个数的二进制位中1的个数,不过不是先求出所有二进制位再来计算,而是通过位移动的方式。题目区间中很明显一点就是这个数是个32位的,因此我们最多会移动32次来检查结果,并且我们知道,要检查一个数的二进制位中某位为1,我们只需要将这个数和2的幂次方结合进行。:题意很简单就不说了,这里先说一种最简单的解法,首先我们知道一点:n&(n-1)相当于把是将n的二进制位中最低位的1变为了0,其它位保持不变,因此可以利用这个特性进行解答。原创 2024-04-21 20:24:32 · 362 阅读 · 0 评论 -
【LeetCode】187. 重复的DNA序列
出现次数大于等于2次,因此我们可以直接使用hash结构记录每个子串出现的次数,边记录边统计答案即可。原创 2024-04-21 19:46:46 · 239 阅读 · 3 评论 -
【LeetCode】3. 无重复字符的最长子串
思路:典型的 双指针+hash,定义两个指针left,right,用于维护一个没有重复字符的区间,这个区间内的字符都是没有重复的,初始时候left和right都指向同一个位置,right指针会在遍历字符串时候一直++,在right++的过程中会将每个字符添加到hash结构中,left++的条件是当right++遇到了重复字符的时候,开始进行区间去重(更新left的位置,使得[left,right]没有重复字符),跑到下一个使得当前区间[left,right]没有重复字符的位置。原创 2024-04-21 17:52:29 · 290 阅读 · 0 评论 -
【LeetCode】23. 合并 K 个升序链表
顺序合并的效率并不高,这样做就类似于阻塞操作,合并前面的链表的时候,无关的链表啥事儿都干不了,因此,我们可以考虑进行分治,先递归地划分区间两两合并,最后再将总的合并起来。顺序合并思路很简单,就是顺序地将这K个链表两两地进行合并。原创 2023-11-05 17:23:09 · 726 阅读 · 0 评论 -
【LeetCode】210. 课程表 II——拓扑排序
题解:从题目描述来看,很容易就知道是拓扑排序问题了,问题在于如何存图,如何解答,存图方式比较多,邻接表、邻接矩阵,解方面:遍历、搜索、以及队列都能完成该题的解答,实现方面很多时候还是会依赖一些语言特性,比如java、c++中有队列,可以将度为0的点放进队列中,每次出队一个去边,而在golang中数据结构支持相对匮乏,因此可以采用遍历或者搜索方式完成。可能会有多个正确的顺序,你只要返回 任意一种 就可以了。例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示:[0,1]。原创 2023-09-10 17:21:13 · 1417 阅读 · 1 评论 -
【LeetCode】124. 二叉树中的最大路径和
这类题目一般可以通过dfs方式完成,首先我们明白,想要获取这棵二叉树中的最大路径和,那么我们需要知道以每个节点为根的最大路径和,最后找最大的就可以得到答案。那么如何找一个节点的最大路径和呢,一个节点的最大路径和为它的左右两边节点的。,最终每个节点最多会被遍历一次,总的时间复杂度为O(n)。相加的结果,因此,在dfs时候我们需要获取的就是。原创 2023-03-05 18:02:58 · 120 阅读 · 0 评论 -
[LeetCode]1237. 找出给定方程的正整数解
这种方法关键在于直接利用函数单调递增的特性,一个答案从前往后找,另一个答案从后往前找,下一次寻找一定是基于上一次的结果,因此会少很多次遍历,x最多遍历1000次,y总的遍历次数也最多1000次,因此总的时间复杂度为O(x+y)。既然我们知道y每次都从头开始找比较慢,那么我们可以优化y的查找时间,利用二分查找即可将找y的复杂度降到log级别,因此总的时间复杂度为O(xlogy)。暴力枚举法每次都从开始找y,x最多枚举1000次,而y每次也会枚举1000次,因此,总的复杂度为O(x*y)。原创 2023-02-18 17:38:28 · 643 阅读 · 0 评论 -
【LeetCode】多数元素
给定一个大小为 n 的数组nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于⌊ n/2 ⌋的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。原创 2023-01-15 17:13:25 · 123 阅读 · 0 评论 -
【LeetCode】42. 接雨水
题目链接:42. 接雨水题目描述:题意:题目比较简短,但是图却是很清晰,从图中我们可以看出,当前位置能接的雨水肯定与左右两边中的最高块有关,并且是和它们中的最小值相关,否则就直接溢出了,装不下。思路一:动态规划思路现在我们很明确了,我们要做的就是寻找当前位置的左右两边的最大值,再取它们中的最小值来减去当前位置的高度就能得到当前位置能接的雨水量。这时候,就能很容易想到用两个数组分别记录每个位置的这两个值即可,并且状态转移也是非常的简单,见下面代码。代码:class Solution {原创 2022-03-25 11:00:10 · 1452 阅读 · 0 评论 -
【LeetCode】61. 旋转链表
题目链接:61. 旋转链表题目描述:思路:思路很容易想到,利用链表长度n减去当前要移动的次数k得到真正需要移动的步数n-k,需要保证一个前提就是k是小于等于n的,这个可以通过取模运算来完成,然后我们移动链表头指针走n-k步,将前一段的链表断开,然后将后半段的尾部指向前半段的头部即可。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; *原创 2022-03-24 21:32:00 · 745 阅读 · 0 评论 -
【LeetCode】剑指 Offer II 008. 和大于等于 target 的最短子数组+26. 删除有序数组中的重复项
题目链接:剑指 Offer II 008. 和大于等于 target 的最短子数组题目描述:思路:这类题做多了就知道思路用双指针,维护两个指针,区间内维护答案,右指针会不停移动,移动过程中记录下区间中的所有数之和sum,当移动到某个位置时出现sum大于等于target时候,计算答案,再不停移动左指针,直到sum<target,所有答案中取最小即可。代码:class Solution { public int minSubArrayLen(int target, int[] nums)原创 2022-03-22 20:21:00 · 154 阅读 · 0 评论 -
【LeetCode】剑指 Offer 45. 把数组排成最小的数
题目链接:剑指 Offer 45. 把数组排成最小的数题目描述:思路:看了这个题,最简单思路就是排序,可以使用数组的排序,需要自定义一个比较规则,这个比较规则为两个数拼接起来要最小的结果,比如10和2拼接有102和210两种结果,这里显然需要102的答案。为了更加方便,这里采用堆来定义这个规则,并且lambda表达式非常方便就实现了,代码极少。代码:class Solution { public String minNumber(int[] nums) { Priority原创 2022-02-11 21:03:51 · 225 阅读 · 0 评论 -
【LeetCode】剑指 Offer II 100. 三角形中最小路径之和
题目链接:剑指 Offer II 100. 三角形中最小路径之和题目描述:思路:这题和数字三角形差不多思路,直接能想到动态规划,需要注意状态的转移和边界的初始化条件。代码:class Solution { public int minimumTotal(List<List<Integer>> triangle) { int n=triangle.size(); int dp[][]=new int[n][n]; dp[原创 2022-02-08 21:46:40 · 649 阅读 · 0 评论 -
【LeetCode】1405. 最长快乐字符串
题目链接:1405. 最长快乐字符串题目描述:思路:很容易想到的一个思路—贪心,每次都选取当前剩余数量最多的字母,并检查添加该字母后是否会破坏快乐字符串性质(不会出现连续出现三个相同的字母),此时如果破坏了这种性质,那么就选择第二大的,以此内推下去。为了实现每次取出当前剩余数量最大的字母,借助一个优先队列完成,也可以不借助,但是会多做很多判断。代码:class Solution { public String longestDiverseString(int a, int b, int c原创 2022-02-08 20:23:40 · 218 阅读 · 0 评论 -
【LeetCode】剑指 Offer 29. 顺时针打印矩阵、螺旋矩阵系列
题目链接:剑指 Offer 29. 顺时针打印矩阵题目描述:解法:和蛇形填数差不多思想,进行模拟。定义上下左右四个变量模拟即可,具体见代码。class Solution { public int[] spiralOrder(int[][] matrix) { if (matrix == null || matrix.length == 0 || matrix[0].length == 0) { return new int[0]; }原创 2022-01-23 22:30:51 · 349 阅读 · 0 评论 -
【LeetCode】剑指 Offer 12. 矩阵中的路径
题目链接:剑指 Offer 12. 矩阵中的路径题目描述:思路:这题一看就是搜索,直接套dfs求连通块的板子。简单解释一下就是:找一个开始能匹配进行搜索,搜索该条路过程中标记搜索过的点(这里为矩阵中的字母),当找到一条链路之后递归返回匹配成功如果不能匹配成功,在回溯时候需要进行标记还原class Solution { private char[][] board; private boolean vis[][]; int dir[][]={{1,0},{-1,0},{原创 2022-01-20 21:28:53 · 324 阅读 · 0 评论 -
【LeetCode】剑指 Offer 11. 旋转数组的最小数字
题目链接:剑指 Offer 11. 旋转数组的最小数字一个简单题,乍一看直接遍历记录个最小值就完事儿,当然这也能直接过,于是写了如下代码:class Solution { public int minArray(int[] numbers) { if(numbers.length==1) return numbers[0]; int res=numbers[0]; for(int num : numbers){ res=r原创 2022-01-18 21:16:32 · 206 阅读 · 0 评论 -
【Leetcode】剑指 Offer 59 - I. 滑动窗口的最大值
题目链接:剑指 Offer 59 - I. 滑动窗口的最大值题目描述:给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。暴力思路:这题暴力思路则是利用双指针维护窗口大小,每次遍历窗口中的元素寻找最大值,此时时间复杂度明显为O(n*k),O(k)的复杂度来源于每次都需要遍历窗口中的元素找最大值,此时我们可以想到用一些数据结构,比如利用一个大根堆(堆顶元素最大)维护一个当前窗口的最大值。此时寻找窗口最大值变为O(logk),主要还是添加元素和删除元素的调整复杂度,总的复杂度也就变原创 2022-01-12 21:02:07 · 128 阅读 · 0 评论 -
【LeetCode】表达式求值、后缀表达式、计算器系列
题目链接:面试题 16.26. 计算器227. 基本计算器 II两个题都用中缀转后缀进行计算,无非就是第二题多了括号,在此之前,先明白两个概念操作数和操作符:操作数,就是指表达式中的数字,而操作符指的是表达式中的符号如+、-、* 、/、(、[、]、)等。先回顾下中缀转后缀的流程:对于一个中缀表达式:a + b * c + (d * e + f ) * g我们一般采用基于栈的方式进行转换,这里会用到两个栈,操作数栈和操作符栈,这一点《数据结构》中也有讲过:1、首先从左到右扫描每一个字符。如果扫描原创 2021-11-25 12:07:40 · 1361 阅读 · 0 评论 -
【LeetCode】字符串压缩和解压缩
题目链接:面试题 01.06. 字符串压缩题目描述:字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。示例1:输入:"aabcccccaaa"输出:"a2b1c5a3"示例2: 输入:"abbccd"输出:"abbccd"解释:"abbccd"压缩后为"a1b2c2d1",比原字符串长度更长。代码:cla原创 2021-11-24 21:15:13 · 964 阅读 · 0 评论 -
【LeetCode】1186. 删除一次得到子数组最大和
我们先看非常类似的简单题:53. 最大子序和思路:这题使用动态规划表述比较简单,以dp[i]表示以第i个元素结尾的子数组最大和,于是我们可以很快得到状态转移, dp[i]=Math.max(dp[i-1]+nums[i],nums[i]);这样我们就记录了第i个元素结尾的最大子数组和了。class Solution { public int maxSubArray(int[] nums) { int n=nums.length; int dp[]=new int原创 2021-11-23 22:06:19 · 662 阅读 · 0 评论 -
【LeetCode】两数和、三数和、四数和、和为k系列
题目链接:两数之和题目描述:思路:哈希记录出现过的数的下标,再遍历后面的数num的时候检查一下是否出现了target-num的数,有则找到了答案。class Solution { public int[] twoSum(int[] nums, int target) { if(nums.length<2) return new int[0]; Map<Integer,Integer> maps=new HashMap<>();原创 2021-11-20 20:12:01 · 553 阅读 · 0 评论 -
【NewCoder】NC70 单链表的排序
题目链接:NC70 单链表的排序简单单链表排序,简单的题解就不写了,用辅助空间记录其中元素值,对val排序之后在进行链表链接。这里采用的归并排序的方式进行单链表的排序,和数组归并一样,也是先找到链表中点,然后不停划分子链表,直到每个子链表为一个元素后开始进行两两合并。代码:import java.util.*;/* * public class ListNode { * int val; * ListNode next = null; * } */public class原创 2021-11-15 15:05:31 · 473 阅读 · 0 评论 -
【LeetCode】287. 寻找重复数
题目链接:287. 寻找重复数有趣的解法:对该数组建图,给每个位置增加一条i指向nums[i]的边,既然存在重复的数,那么最后一定有多条边指向同一个位置(重复的位置),因此该图存在环,最后我们使用快慢指针找到相遇的位置,此后再将满指针指向起始位置,和快指针同步移动就能找到入环口了。代码:class Solution { public int findDuplicate(int[] nums) { int fast=0,slow=0; do{原创 2021-11-14 20:18:40 · 3645 阅读 · 0 评论 -
【LeetCode】只出现一次的数字系列
1、136. 只出现一次的数字思路很简单,这道题很特殊,因为只有一个数出现了一次,其余的出现了两次,我们知道异或运算对于相同的数字异或结果都为0,因此采用异或运算能很快解决这个题目。class Solution { public int singleNumber(int[] nums) { int ans=0; for(int num:nums){ ans^=num; } return ans; }原创 2021-11-13 16:34:01 · 2077 阅读 · 0 评论 -
【LeetCode】189. 轮转数组
题目链接:189. 轮转数组代码:class Solution { public void rotate(int[] nums, int k) { int n=nums.length; if(k>n) k%=n; //确保下标符合规范 reverse(nums,0,n-k-1); //反转前n-k个 reverse(nums,n-k,n-1); //反转最后k个 reverse(nums,0,n-1); //原创 2021-11-09 21:44:21 · 698 阅读 · 0 评论 -
【LeetCode】238. 除自身以外数组的乘积
题目链接:238. 除自身以外数组的乘积题目描述:给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。思路:用两个数组分别表示这个数左边的数的乘积和右边的数的乘积(不包含该数本身),最后将左右两边的这两个数组乘起来就ok了。代码:class Solution { public int[] productExceptSelf(int[] nums) {原创 2021-11-03 11:53:58 · 453 阅读 · 0 评论 -
【LeetCode】缺失的数系列
题目链接:41. 缺失的第一个正数给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。思路:本题如果没有O(1)空间的限制,直接使用hash表就可以了,这里限制了使用空间,那么按照官方推荐解法可以对nums原数组进行改造,使其为一个hash表,并且有序。对于一个长度为 NN 的数组,其中没有出现的最小正整数只能在 [1,N+1][1, N+1][1,N+1] 中。这是因为如果 [1,N][1, N][1,N]原创 2021-10-31 21:54:42 · 141 阅读 · 0 评论 -
【LeetCode】160. 相交链表
题目链接:160. 相交链表题目描述:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。图示两个链表在节点 c1 开始相交:题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原始结构 。方法一:先求出两个链表的长度为lenA和lenB,定义两个指针分别指向两个链表,然后让长一点的链表指针先走abs(lenA-lenB)步,最后两个链表指针同步移动,直到找到相交的位置(即使是最后的nul原创 2021-10-30 12:15:11 · 65 阅读 · 0 评论 -
【LeetCode】买卖股票系列
问题1:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?题目链接:剑指 Offer 63. 股票的最大利润贪心:强调只买卖一次,因此只需要记录一个当前的最小值即可,每遍历一个数都算一遍答案。代码:class Solution { public int maxProfit(int[] prices) { if(prices.length<2) return 0; int minNum=prices[0];原创 2021-10-29 20:28:36 · 197 阅读 · 0 评论 -
【LeetCode】31. 下一个排列
题目链接:31. 下一个排列思路(官方题解):时间复杂度为O(n).代码:class Solution { public void nextPermutation(int[] nums) { int n=nums.length; if(n==1) return ; int i=n-2; while(i>=0&&nums[i]>=nums[i+1]) i--; //找到第一个顺序对原创 2021-10-29 15:13:43 · 392 阅读 · 0 评论 -
【LeetCode】184. 部门工资最高的员工
题目链接:部门工资最高的员工解法1:临时表select distinct de.Name as Department, em.Name as Employee ,temp.Salary from (select em.DepartmentId as DepartmentId,max(em.Salary)Salary,de.Name as Department,em.Name as Employee from Employee em join Department de on em.DepartmentI原创 2021-10-18 16:47:45 · 92 阅读 · 0 评论 -
【LeetCode】45. 跳跃游戏 II
传送门:45. 跳跃游戏 II题目描述:给你一个非负整数数组 nums ,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。假设你总是可以到达数组的最后一个位置。样例:输入: nums = [2,3,1,1,4]输出: 2解释: 跳到最后一个位置的最小跳跃数是 2。 从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。输入: nums = [2,3,0,1,4]输出原创 2021-10-15 22:42:29 · 1276 阅读 · 0 评论 -
【笔试】Shopee 2022秋招提前批Client笔试
1、输入一个正整数数组,输出由数组里面所有数字组成的最大正整数; 如 {4, 2, 3} 得 432 。思路:这题常规思路就是排个序再做,此时时间复杂度为O(nlogn),而更好的解决方法就是利用计数排序思想,开辟一个最大值的数组,记录每个数是否出现,最后倒序记录答案,这种方法适用于数字不大的情况,时间复杂度为O(n)。import java.util.*;public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定原创 2021-10-07 10:46:07 · 207 阅读 · 0 评论 -
【笔试】2022游卡校招技术岗笔试
1、给你一个字符串 S,找出所有长度为 K 且包含重复字符的子串,请你返回全部满足要求的子串的数目。思路:利用两个指针维护k长度的串,用map记录串中出现的字符,用set记录当前k长度的串中重复的字符,两个指针同步移动时候注意右边指针字符的加入检查和左边移除的字符检查,检查当前k长度字符串是否重复字符条件就是set中是否有元素。代码:import java.util.*;public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,原创 2021-10-06 19:03:31 · 1187 阅读 · 0 评论 -
[LeetCode]152. 乘积最大子数组
传送门:152. 乘积最大子数组题意:给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。样例:输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6。思路:维护一个正的最大值和负的最小值,当前的正的最大值更新时依赖于前一个正的最大值和负的最小值(当前的值为负)。代码1:class Solution { public int maxProduct(int[] nums) {原创 2021-09-18 10:04:17 · 66 阅读 · 0 评论 -
【LeetCode】5. 最长回文子串
传送门:5. 最长回文子串题目描述:给你一个字符串 s,找到 s 中最长的回文子串。测试数据:样例1:输入:s = "babad"输出:"bab"解释:"aba" 同样是符合题意的答案。样例2:输入:s = "cbbd"输出:"bb"样例3:输入:s = "a"输出:"a"暴力思路:求回文串的暴力思路一般是枚举出区间,判断区间内的串是否为回文串。枚举区间复杂度为O(n2)O(n^2)O(n2),判断回文串的复杂度一般为O(n/2)O(n/2)O(n/2),所以整体复杂度为O(n3原创 2021-09-13 21:26:41 · 130 阅读 · 0 评论 -
【LeetCode】724. 寻找数组的中心下标
题目链接:724. 寻找数组的中心下标题目描述:给你一个整数数组 nums,请编写一个能够返回数组 “中心下标” 的方法。数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。如果数组不存在中心下标,返回 -1 。如果数组有多个中心下标,应该返回最靠近左边的那一个。注意:中心下标可能出现在数组的两端。样例:输入:nums = [1, 7, 3, 6, 5, 6]输出:3解释:中心下标是 3 。左侧数之和 (1 + 7 + 3 = 11),右侧数之和 (5原创 2021-05-31 21:27:34 · 216 阅读 · 0 评论 -
【LeetCode】523. 连续的子数组和
题目链接:523. 连续的子数组和题目描述:给定一个包含 非负数 的数组和一个目标 整数 k ,编写一个函数来判断该数组是否含有连续的子数组,其大小至少为 2,且总和为 k 的倍数,即总和为 n * k ,其中 n 也是一个整数。样例:输入:[23,2,4,6,7], k = 6输出:True解释:[2,4] 是一个大小为 2 的子数组,并且和为 6。输入:[23,2,6,4,7], k = 6输出:True解释:[23,2,6,4,7]是大小为 5 的子数组,并且和为 42。数据范围:原创 2021-05-31 20:44:10 · 65 阅读 · 0 评论