LeetCode每日一题
LeetCode刷题,每天更新。
1 + 1=王
CSDN博客专家;
CSDN优质创作者;
阿里云社区专家博主;
华为云云享专家;
51CTO专家博主;
热爱JAVA的计算机科学与技术(人工智能)研究生在读;
全国大学生计算机设计大赛国家二等奖;
三维数字化创新设计大赛四川省特等奖、国家三等奖;
蓝桥杯全国软件与信息技术专业人才大赛三等奖;
MathorCup数学建模挑战赛三等奖.
展开
-
回溯算法基本思想及其实现
在深度优先搜索的过程中,当搜索到某一层时,根据问题的限制条件判断该层的节点状态是否满足条件。如果条件不满足,则这个节点的状态被排除,并回溯到当前节点的父节点,重新进行遍历。如果条件满足,则继续搜索下一层的节点,并重复以上操作,直到搜索到一个符合条件的解或者遍历完整个解空间。如果递归过程中发现当前状态不符合要求,则需要撤销前面的选择,回到上一层状态,重新开始搜索。它的基本思想是从可能的决策开始搜索,如果发现这条路往下走不能得到有效的解答,就返回上一层重新选择另外一种可能的决策,并且重复以上的步骤。原创 2023-06-15 18:35:53 · 1795 阅读 · 1 评论 -
【LeetCode】 - 20.有效的括号
@TOC给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:原创 2022-08-11 17:40:10 · 142 阅读 · 1 评论 -
字节跳动2019春招研发编程题——万万没想到之抓捕孔连顺(Java实现)
请听题给定N(可选作为埋伏点的建筑物数)、D(相距最远的两名特工间的距离的最大值)以及可选建筑的坐标,计算在这次行动中,大锤的小队有多少种埋伏选择。万万没想到,计划还是失败了,孔连顺化妆成小龙女,混在cosplay的队伍中逃出了字节跳动大街。第二行包含N个建筑物的的位置,每个位置用一个整数(取值区间为[0,1000000])表示,从小到大排列(将字节跳动大街看做一条数轴)经过精密的计算,我们从X种可行的埋伏方案中选择了一种。第一行包含空格分隔的两个数字N和D(1≤N≤1000000;...原创 2022-07-24 09:30:00 · 337 阅读 · 0 评论 -
字节跳动2019春招研发编程题——万万没想到之聪明的编辑(Java实现)
万万没想到,我被开除了,临走时老板对我说“做人做事要兢兢业业、勤勤恳恳、本本分分,人要是行,干一行行一行。要是不行,干一行不行一行,一行不行行行不行。我负责校对投稿来的英文稿件,这份工作非常烦人,因为每天都要去修正无数的拼写错误。我在蓝翔学过挖掘机和程序设计,按照这个原理写了一个自动校对器,工作效率从此起飞。用不了多久,我就会出任CEO,当上董事长,迎娶白富美,走上人生巅峰,想想都有点小激动呢!第一行包括一个数字N,表示本次用例包括多少个待校验的字符串。N行,每行包括一个被修复后的字符串。...原创 2022-07-23 09:57:30 · 468 阅读 · 0 评论 -
【LeetCode】第48天 - 1037. 有效的回旋镖
没想到遇到一道纯数学题。所谓的“有效的回旋镖”就是指所给的三个点不在同一条直线上。原创 2022-06-08 19:08:32 · 163 阅读 · 0 评论 -
【LeetCode】第47天 - 944. 删列造序
@TOC 题目描述 解题思路 此题比较简单,详见代码注释。 代码实现 class Solution { public int minDeletionSize(String[] strs) { int length = strs.length; //得到一共有多少个字符串 int column = strs[0].length(); //得到每个每个字符串的长度及列数 int res = 0; //记录要删除的列数原创 2022-05-12 21:45:29 · 207 阅读 · 0 评论 -
【LeetCode】第46天 - 906. 超级回文数 | 9. 回文数
文章目录9. 回文数题目描述解题思路代码实现906. 超级回文数题目描述解题思路代码实现 9. 回文数 题目描述 解题思路 首先将整数x转换为字符串型x_str; 遍历x_str.length()/2次,比较第 i 位与倒数第 i 位字符是否相同,如果不同返回false; 遍历结束,返回true。 代码实现 class Solution { public boolean isPalindrome(int x) { if(x<0){ //x为负肯定不是回文数原创 2022-04-17 20:11:33 · 291 阅读 · 0 评论 -
【LeetCode】第45天 - 728. 自除数
728. 自除数题目描述解题思路代码实现 题目描述 解题思路 此题关键在于遍历整数的每一位,判断每一位数是否为0,以及是否可以整除该整数。 提出以下方法遍历整数的每一位: 每次将当前整数对 10取余即可得到当前整数的最后一位,然后将整数除以 10。重复该操作,直到当前整数变成 0时即遍历了整数的每一位。 代码实现 class Solution { public List<Integer> selfDividingNumbers(int left, int right) {原创 2022-03-31 19:18:34 · 439 阅读 · 1 评论 -
【LeetCode】第44天 - 100. 相同的树
100. 相同的树题目描述解题思路代码实现 题目描述 给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 解题思路 当且仅当两个二叉树的结构完全相同,且所有对应节点的值相同时,才返回true。 先判断p、q是否为空,如果都为空,则都为空树,返回true;如果一个为空另一个不为空,返回false。 若p、q都不为空,则比较p、q对应的值是否相等,如果不相等,返回false;如果相等,则继续迭代判断p、q的左子树和右原创 2022-03-10 20:07:15 · 226 阅读 · 0 评论 -
【LeetCode】第43天 - 136. 只出现一次的数字 | 169. 多数元素
文章目录136. 只出现一次的数字题目描述解题思路代码实现169. 多数元素题目描述解题思路代码实现 136. 只出现一次的数字 题目描述 解题思路 此题可以运用异或运算的性质,遍历一次数组,将所有元素做一次异或运算,所有元素的异或运算结果即为数组中只出现一次的数字。 异或运算的性质 任何数和 0 做异或运算,结果仍然是原来的数,即 a⊕0=a。 任何数和其自身做异或运算,结果是 000,即 a⊕a=0。 此题比较简单,但位运算使我们很容易忽略掉的方法,用好位运算有时会大大简化题目和代码。 代码实现原创 2022-03-09 08:22:58 · 226 阅读 · 2 评论 -
【LeetCode】第42天 - 232. 用栈实现队列
232. 用栈实现队列题目描述解题思路代码实现 题目描述 解题思路 题目需求是使用栈(后进先出)来达到队列的效果(先进先出)。 对此我们可以使用两个栈来完成队列的操作,步骤如下: 创建两个栈:输入栈和输出栈(输入栈用来传入元素push,输出栈用来输出元素pop) 当需要入队时,输入栈push(x); 当需要出队时,如果输出栈不为空直接pop();如果输出栈为空,则现将输入栈的所有元素压入输出栈中,然后再输出栈pop; 当输入栈和输出栈全部为空时,则队列为空。 代码实现 class MyQueue {原创 2022-03-04 22:10:45 · 386 阅读 · 0 评论 -
【LeetCode】第41天 - 141. 环形链表
141. 环形链表题目描述解题思路代码实现 题目描述 解题思路 代码实现原创 2022-03-02 20:25:05 · 705 阅读 · 1 评论 -
【LeetCode】第40天 - 566. 重塑矩阵
566. 重塑矩阵题目描述解题思路代码实现 题目描述 解题思路 首先判断输入是否合法,即 r * c是否等于 mat.length * mat[0].length,如果不等直接返回mat; 使用两个整数 h 和w,分别表示结果数组的高(行)和宽(列),初始时 h 和w均为0; 遍历mat数组,每遍历一个元素将其存入结果数组中,并将w + 1,当w == c时,将h + 1,以及w置为0。直至遍历结束,得到转换后的矩阵。 代码实现 class Solution { public int[][]原创 2022-02-26 22:15:00 · 305 阅读 · 0 评论 -
【LeetCode】第39天 - 350. 两个数组的交集 II
350. 两个数组的交集 II题目描述解题思路代码实现 题目描述 解题思路 1.先将两个数组排序; 2.然后用两个指针分别遍历两个数组,双指针的移动规则如下: 初始时,两个指针分别指向数组的头部。每次遍历比较两个指针所在位置的值,如果相等则将该值加入结果数组中(交集),同时将两个指针都向后移动一位;如果不等,则将较小值的指针向后移动一位。 3.直到两个数组中的一个遍历完成,则结束遍历。 代码实现 class Solution { public int[] intersect(int[] num原创 2022-02-24 20:38:37 · 427 阅读 · 1 评论 -
【LeetCode】第38天 - 217. 存在重复元素
217. 存在重复元素题目描述解题思路代码实现 题目描述 解题思路 第一种思路: 先对nums数组排序,然后再在遍历nums,如果nums[i] == nums[i + 1],则返回true。 第二种思路: 利用Set集合的性质(不存储相同值),遍历一次nums集合并set.add(),如果add失败,则存在相同元素,返回true。 这里是Set系列集合的源码分析:【攻克java集合系列(三)】java集合中的Set系列集合全面分析 代码实现 class Solution { public boo原创 2022-02-05 21:15:00 · 570 阅读 · 0 评论 -
【LeetCode】第37天 - 1614. 括号的最大嵌套深度
1614. 括号的最大嵌套深度题目描述解题思路代码实现 题目描述 解题思路 遍历一次字符串 当s[i]=’(’ 时,就将当前深度+1,并将返回结果与当前深度的较大值赋值给返回值; 当s[i]=’)’ 时,就将当前深度-1。 代码实现 class Solution { public int maxDepth(String s) { /** * res:返回值 * level:当前深度 */ int res = 0,原创 2022-01-07 21:00:00 · 509 阅读 · 1 评论 -
【LeetCode】第36天 - 27. 移除元素
27.移除元素题目描述解题思路代码实现 题目描述 解题思路 题目要求只需要返回新数组的长度,所以我们可以考虑遍历数组,将发现的val值的元素与最后一个非val值的元素交换位置,并使用一个count记录非val值元素的个数,count值即为新数组的长度。 (详细见代码注释) 代码实现 class Solution { //交换两个元素的位置 public void sort(int[] nums, int left, int right){ int temp = nums[l原创 2021-12-15 19:19:14 · 746 阅读 · 0 评论 -
【LeetCode】第35天 - 283. 移动零
283. 移动零题目描述代码实现 题目描述 代码实现 class Solution { public void swap(int[] nums, int left, int right){ int temp = nums[left]; nums[left] = nums[right]; nums[right] = temp; } public void moveZeroes(int[] nums) { int left原创 2021-12-13 18:52:53 · 202 阅读 · 0 评论 -
【LeetCode】第34天 - 53. 最大子数组和
53. 最大子数组和题目描述解题思路代码实现 题目描述 解题思路 可以使用动态规划的思想,想要求得前i个元素的最大连续子数组和,只需要先得到前i-1个元素的最大连续子数组和(temp),然后将temp + nums[i] 与nums[i]做比较,较大者即为前i个元素的最大连续子数组和。 代码实现 class Solution { public int maxSubArray(int[] nums) { int max = nums[0], temp = 0; for原创 2021-12-08 19:45:01 · 104 阅读 · 0 评论 -
【LeetCode】第33天 - 1816. 截断句子
1816. 截断句子题目描述解题思路代码实现 题目描述 解题思路 遍历字符串,判断当前字符是否为空格,并用一个计数器count记录出现的空格次数,当出现的空格次数等于 k 时,返回索引0~记录的最后一个空格索引的字符串。 代码实现 class Solution { public String truncateSentence(String s, int k) { int count = 0; //记录空格出现的次数 for(int i=0;i<s.l原创 2021-12-07 21:04:48 · 267 阅读 · 0 评论 -
【LeetCode】第32天 - 383. 赎金信
题目描述 解题思路 这道题就是判断判断 ransomNote 能不能由 magazines 里面的字符构成。如果可以构成,返回 true ;否则返回 false 。magazine 中的每个字符只能在 ransomNote 中使用一次。 首先我们可以遍历magazine,统计magazine中各字符出现的次数,并用数组count存储起来。 然后再遍历ransomNote ,将ransomNote[i]在magazine中出现的次数减1,当次数小于0时,说明magazine中不包含该字符,即ransomN原创 2021-12-04 16:49:00 · 206 阅读 · 0 评论 -
【LeetCode】第31天 - 506. 相对名次
506. 相对名次题目描述解题思路代码实现 题目描述 解题思路 首先使用一个哈希表,哈希表的key,value分别存放第i位运动员的得分和 i; 然后复制score并排序; 根据得分查到该运动员在score中的位置,并在该位置赋值该运动员的名次。 (结合代码分析) 代码实现 class Solution { public String[] findRelativeRanks(int[] score) { int n = score.length; String[原创 2021-12-02 17:26:25 · 407 阅读 · 0 评论 -
【LeetCode】第30天 - 1446. 连续字符
1446. 连续字符题目描述解题思路代码实现 题目描述 解题思路 这道题是比较简单的,只需要遍历一次比较当前字符与当前字符的第一个字符是否相同。 如果相同则将当前连续长度加1 ;如果不同,则比较当前连续长度与最大连续长度的大小(如果当前连续长度大圩最大连续长度,则更新最大连续长度),然后将当前连续长度重置为1。 代码实现 class Solution { public int maxPower(String s) { int maxLength = 1; //最大连续长度原创 2021-12-01 19:52:53 · 125 阅读 · 0 评论 -
【LeetCode】第29天 - 519. 随机翻转矩阵
519. 随机翻转矩阵题目描述解题思路代码实现 题目描述 解题思路 题目中要求尽量少的使用内置随机函数,所以我们考虑把行列(m,n)的二元数组matrix[i][j]转换为长度为m * n 的一维数组array[k],其中的映射关系为k = i * n + j。这样我们在每次执行filp()时只需要执行一次内置随机函数,就可以定位到二元数组中的一个元素。 代码实现 class Solution { Map<Integer, Integer> map = new HashMap原创 2021-11-28 14:54:41 · 209 阅读 · 0 评论 -
【LeetCode】第28天 - 700. 二叉搜索树中的搜索
700. 二叉搜索树中的搜索题目描述解题思路代码实现 题目描述 解题思路 首先明白什么是二叉搜索树? 它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。(左<根<右) 那么对于本题有以下思路: 遍历每个结点,比较当前结点的val值与目标val值的大小; 若当前结点的val值等于目标val值,返回当前结点;若当前结点的val值小于目标v原创 2021-11-26 12:24:36 · 298 阅读 · 0 评论 -
【LeetCode】第27天 - 70. 爬楼梯
70. 爬楼梯题目描述解题思路代码实现 题目描述 解题思路 现在我们需要爬上阶梯子,规定每次只能向上爬1阶或2阶。 我们从最顶层开始考虑, 令爬上第n阶有f(n)种方法; 因为每次只能向上爬1阶或2阶,所以要想爬上第n阶必须先爬到第n-1或者第n-2阶,则f(n) = f(n-1) + f(n-2); 如果要想爬上第n-1阶必须先爬到第n-2或者第n-3阶,则f(n-1) = f(n-2) + f(n-3)。这样就得到一个递推公式f(x) = f(x-1) + f(x-2)。 第0阶和第1阶有1种方法,原创 2021-11-24 21:55:48 · 661 阅读 · 0 评论 -
【LeetCode】第26天 - 859. 亲密字符串
859. 亲密字符串题目描述解题思路代码实现 题目描述 解题思路 可以分为两种情况来考虑: 一是s = goal,此时只有这两个字符串中有重复字符时,才能认为它们是亲密字符串,交换重复字符就能得到另一个; 二是s != goal,此时它们只能有两个位置(one、two)不同,而我们交换这两个不同的位置就可以得到另一个(满足s[one]=goal[two] && s[two]= goal[one]; 代码实现 class Solution { public boolean bud原创 2021-11-23 12:11:13 · 180 阅读 · 0 评论 -
【LeetCode】第25天 - 594. 最长和谐子序列
594. 最长和谐子序列题目描述解题思路代码实现 题目描述 解题思路 可以利用哈希表来储存每个元素及每个元素出现的次数,key为元素值,value为元素出现的次数。 首先遍历数组,统计元素的出现次数并存储在哈希表中; 然后遍历哈希表,统计相邻元素值出现次数(即满足|key1-key2|=1),那么当前最长和谐子序列为value1 + value2与前一组最长和谐组序列的较大值。 代码实现 class Solution { public int findLHS(int[] nums) {原创 2021-11-20 19:00:00 · 600 阅读 · 0 评论 -
【LeetCode】第24天 - 520. 检测大写字母
520. 检测大写字母题目描述解题思路代码实现 题目描述 解题思路 首先判断首字母是大写还是小写 如果首字母为小写,遍历word,若存在大写字母,返回false; 如果首字母为大写,遍历word,统计大小写字母的个数,若既有大写也有小写字母,返回false。 代码实现 class Solution { public boolean detectCapitalUse(String word) { boolean res = true; //首字母为小写原创 2021-11-19 17:45:52 · 423 阅读 · 0 评论 -
【LeetCode】第23天 - 299. 猜数字游戏
299. 猜数字游戏题目描述解题思路代码实现 题目描述 解题思路 先遍历一次比较secret[i]是否与guess[i]相等,若相等公牛数加1。若不等,则分别统计数字出现的次数。 然后将数字出现次数的较小值累加至母牛数。 (详见代码注释) 代码实现 class Solution { public String getHint(String secret, String guess) { //分别统计数字0-9的出现次数,初始时为0 int[] gue = new原创 2021-11-08 17:41:36 · 2198 阅读 · 0 评论 -
【LeetCode】第22天 - 367. 有效的完全平方数
367. 有效的完全平方数题目描述解题思路代码实现 题目描述 解题思路 一、使用Math内置函数sqrt进行开放并取整,再平方取整结果与num比较。 二、使用折半查找 遍历1至num/2,平方i与num比较(对除1以外的所有平方数num,有num/2必定大于num开方,所以不必比较num/2至num部分)。 代码实现 class Solution { public boolean isPerfectSquare(int num) { //开方 //return num ==原创 2021-11-04 16:51:57 · 91 阅读 · 0 评论 -
【LeetCode】第21天 - 575.分糖果
575.分糖果题目描述解题思路代码实现 题目描述 解题思路 先统计共有多少种种类的糖果(利用Set的特点:不重复存储值),种类数即为集合的长度; 因为是均分,所以每个人最多可以分到n/2个。当种类数大于n/2时,返回n/2;当种类数小于n/2时,返回种类数。 代码实现 class Solution { public int distributeCandies(int[] candyType) { // Arrays.sort(candyType); // int原创 2021-11-02 15:11:38 · 225 阅读 · 0 评论 -
【LeetCode】第20天 - 260. 只出现一次的数字 III
260. 只出现一次的数字 III题目描述解题思路代码实现 题目描述 解题思路 法一、直接比较(代码实现注释部分) 先对数组元素进行排序,然后遍历数组剔除重复元素。 法二、哈希表(代码实现) 使用一个哈希映射统计数组中每一个元素出现的次数。(key为nums[i],value为出现的次数) 对哈希映射进行遍历,将所有只出现了一次的数放入答案中。 代码实现 class Solution { public int[] singleNumber(int[] nums) { // in原创 2021-11-01 14:36:49 · 143 阅读 · 0 评论 -
【LeetCode】第19天 - 14. 最长公共前缀
14. 最长公共前缀题目描述解题思路代码实现 题目描述 解题思路 首先假设公共前缀result = strs[0]; 然后将result与strs[1]进行比较,并更新result; 继续比较result与strs[i]并更新result,直至遍历完strs。 代码实现 class Solution { public String longestCommonPrefix(String[] strs) { String result = strs[0]; int原创 2021-10-28 16:39:14 · 153 阅读 · 0 评论 -
【LeetCode】第18天 - 345. 反转字符串中的元音字母
345. 反转字符串中的元音字母题目描述解题思路代码实现 题目描述 解题思路 使用两个指针(left,right),left从前往后遍历,right从后往前遍历; 判断字符串s在left和right位置的字符是否为元音字母,若s[left]为元音字母并且s[right]也为元音字母,则交换两个字符。 代码实现 class Solution { //判断字符是否为元音字母 public boolean isVowels(char ch){ return "aeiouAEIOU"原创 2021-08-20 16:44:35 · 161 阅读 · 0 评论 -
【LeetCode】第17天 - 25. K 个一组翻转链表
25. K 个一组翻转链表题目描述解题思路代码实现 题目描述 解题思路 首先我们需要直到如何翻转一个链表,可参考:https://blog.csdn.net/weixin_43598687/article/details/119563289 然后从头结点开始遍历链表,将k个节点分为一组形成一个子链表,翻转每个子链表; 将子链表的头部与上一个子链表连接,以及子链表的尾部与下一个子链表连接。 代码实现 /** * Definition for singly-linked list. * public原创 2021-08-18 09:29:43 · 141 阅读 · 0 评论 -
【LeetCode】第16天 - 234. 回文链表
234. 回文链表题目描述解题思路代码实现 题目描述 解题思路 遍历链表,将每个节点值依次入栈; 再次遍历链表,每访问一个节点就出栈一个元素,比较该节点值与出栈元素是否相等,不等返回false; 成功遍历,返回true。 代码实现 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * Li原创 2021-08-15 14:30:39 · 101 阅读 · 0 评论 -
【LeetCode】第15天 - 83. 删除排序链表中的重复元素 | 82. 删除排序链表中的重复元素 II
83. 删除排序链表中的重复元素 | 82. 删除排序链表中的重复元素 II题目描述题目1(83. 删除排序链表中的重复元素)题目2(82. 删除排序链表中的重复元素 II)解题思路题目1(83. 删除排序链表中的重复元素)题目2(82. 删除排序链表中的重复元素 II)代码实现题目1(83. 删除排序链表中的重复元素)题目2(82. 删除排序链表中的重复元素 II) 题目描述 题目1(83. 删除排序链表中的重复元素) 题目2(82. 删除排序链表中的重复元素 II) 解题思路 题目1(83. 删除排原创 2021-08-13 09:58:38 · 236 阅读 · 0 评论 -
【LeetCode】第14天 - 61. 旋转链表
61. 旋转链表题目描述解题思路代码实现 题目描述 解题思路 遍历链表,找到尾结点(同时获得链表长度length),并将尾结点的next指向头结点,形成一个循环单链表。 从第length - k个节点开始返回(需要断开第length-k-1个节点,使其next指针指向null) 代码实现 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next;原创 2021-08-12 10:22:29 · 156 阅读 · 0 评论 -
【LeetCode】第13天 - 24. 两两交换链表中的节点 | 94. 二叉树的中序遍历
24. 两两交换链表中的节点题目描述解题思路代码实现 题目描述 解题思路 遍历链表,每次交换head.next和head.next.next节点,直到d.next或head.next.next为空。 代码实现 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int va原创 2021-08-11 09:27:09 · 119 阅读 · 0 评论