06 2023 档案
摘要:题目: 思路: 【1】如果不能转成字符串来判断是不是回文字符串,那么就用除法和余数看能不能复原成原来的数字就可以了。 代码展示: //时间5 ms 击败 98.1% //内存41.7 MB 击败 30.83% class Solution { public boolean isPalindrome(
阅读全文
摘要:题目: 思路: 【1】首先明确对于图的处理不外乎是广度遍历和深度遍历(递归)两种,而且做多的话会发现,深度耗时更少。其次该题目点出了被海水围绕的就会被淹没,那么不会被淹没的就只有从边界触发的陆地。所以对于第一行,最后一行,第一列,最后一列都需要从这里面进行搜索,看有没有延伸,故需要定义三种状态(或者
阅读全文
摘要:题目: 思路: 【1】可以参考 剑指 Offer II 105. 岛屿的最大面积(695. 岛屿的最大面积) 这篇,本质上思路都是一样的 代码展示: 深度优先搜索: //时间2 ms 击败 100% //内存46.3 MB 击败 81.86% class Solution { public int
阅读全文
摘要:题目: 思路: 【1】动态规划 【2】贪心 + 二分查找 // 贪心的思路,使用结果数组来存储,相同子序列中的最小值 // 如【10,9,2,5,3,7,101,18】 // 本质10,9,2都是只有一个最长递增子序列 // 那么其实10 和 9就没什么用了,为什么呢, // 因为后面出现的数字与2
阅读全文
摘要:题目: 思路: 【0】虽说是按位与的结果,但是本质上是求这些数的二进制公共前缀的部分 值为:5 二进制为:101 值为:6 二进制为:110 值为:7 二进制为:111 值为:8 二进制为:1000 值为:9 二进制为:1001 值为:10 二进制为:1010 值为:11 二进制为:1011 值为:
阅读全文
摘要:题目: 思路: 【1】重点是位理念和溢出的问题 代码展示: //时间2 ms 击败 3.44% //内存39.8 MB 击败 77.56% public class Solution { // you need treat n as an unsigned value public int reve
阅读全文
摘要:题目: 思路: 【1】其实都是需要考虑超出最大长度的字符串长度的情况 代码展示: //时间1 ms 击败 99.81% //内存40.5 MB 击败 36.73% //将数据划分为三种情况进行处理 class Solution { public String addBinary(String a,
阅读全文
摘要:题目: 思路: 【1】思路很简单,从后往前倒推回去,因为是10进制所以只需要考虑进位即可,会出现旧数组不能容纳新数组的情况,如【9】->【1,0】这种,容量扩大了。 代码展示: //时间0 ms 击败 100% //内存40.2 MB 击败 6.67% class Solution { public
阅读全文
摘要:题目: 思路: 【1】利用hash表来检索 【2】滑动窗口的思路(缩小空间复杂度,因为k<n) 代码展示: //时间17 ms 击败 83.88% //内存54.5 MB 击败 40.85% //滑动窗口的思路 //时间复杂度:O(n),其中 n 是数组 nums 的长度。 //需要遍历数组一次,对
阅读全文
摘要:题目: 思路: 【1】这道题本质上和 205. 同构字符串 这题十分相似 区别在于一个是字符与字符互相映射,另一个是字符与字符串互相映射 而且思路都是可以借鉴的 代码展示: //时间1 ms 击败 56.94% //内存39.3 MB 击败 82.10% //时间复杂度:O(n+m),其中 n 为
阅读全文
摘要:题目: 思路: 【1】用指针去扫 intervals,最多可能有三个阶段: 1)不重叠的绿区间,在蓝区间的左边 2)有重叠的绿区间 3)不重叠的绿区间,在蓝区间的右边 代码展示: //时间1 ms 击败 95.56% //内存42.8 MB 击败 86.3% //时间复杂度:O(n),其中 n 是数
阅读全文
摘要:题目: 思路: 【1】正常遍历合并即可 代码展示: //时间6 ms 击败 42.95% //内存40.1 MB 击败 6.36% //时间复杂度:O(n),其中 n 为数组的长度。 //空间复杂度:O(1)。除了用于输出的空间外,额外使用的空间为常数。 //为了避免数据溢出导致问题故判断采用 te
阅读全文
摘要:题目: 思路: 【1】首先如果画图,那么根据图我们可知一般都是选取右边界值的地方射出可以引爆最多的气球,而对于数组里面的数最好是有序的,因为便于检索。当然在排序过程中我们习惯了用 两值相减的方式 即 O1-O2这种,但是这种对于INT数据的边界值会存在溢出的情况导致 正数-负数 本应该是正数的情况,
阅读全文
摘要:题目: 思路: 【1】相当于在层次遍历上进行了小修改(如果层数是按0开始的,即碰到奇数层,则将数据倒着放入数组即可) 代码展示: //时间0 ms 击败 100% //内存40.2 MB 击败 73.35% /** * Definition for a binary tree node. * pub
阅读全文
摘要:题目: 思路: 【1】这道题需要知道层次遍历这个理念,因为层次遍历就是把树的节点按照层级来输出,那么既然一层的数据都有了,对这一层进行平均数的统计也就简单了。 代码展示: //时间4 ms 击败 8.92% //内存43.4 MB 击败40.98% //基于层次遍历来进行变动 /** * Defin
阅读全文
摘要:题目: 思路: 【1】利用哈希的方式模拟, 【2】利用下标的方式进行比对 代码展示: 【1】利用哈希的方式模拟, //时间22 ms 击败 33.69% //内存40.4 MB 击败 82.61% //时间复杂度:O(n),其中 n 为字符串的长度。我们只需同时遍历一遍字符串 s 和 t 即可。 /
阅读全文
摘要:题目: 思路: 【1】本质上限制了小写字母,也就是说,出现的字符最多也就26个,所以如果magazine出现的字符能组成ransomNote字符串,那么必然就是不会出现该字符的使用为负的情况,如果负了,那么就是不可能。 代码展示: //时间1 ms 击败 99.22% //内存42.4 MB 击败
阅读全文
摘要:题目: 思路: 【1】首先是要先看懂题目,题目要求的是限制每一行的字符个数,然后在有限的空间内往里面塞集合里面的字符串。而且隐性条件就是两个字符串之间必须要有空格作为间隔,所以就会有 s1.len+1空格+s2.len+1空格+....+sn.len <= maxWidth,如 maxWidth =
阅读全文
摘要:题目: 思路: 【1】暴力破解 【2】动态规划 【3】KMP算法(待写) 代码展示: //时间4 ms 击败 2.42% //内存40 MB 击败 5.5% class Solution { public int strStr(String haystack, String needle) { in
阅读全文
摘要:题目: 思路: 【1】依靠辅助空间,将变更的状态记录到辅助空间则不会干扰到原本的数组 【2】增加变更状态,因为哪怕是状态变更了,也要确保能够识别变更之前的状态,不然记录的结果会不准确 代码展示: //时间0 ms 击败 100% //内存39.8 MB 击败 42.19% //时间复杂度:O(mn)
阅读全文
摘要:题目: 思路: 【1】这道题的难点在于要知道旋转的规律与如何避免重复处理的问题 其中xc和yc分别为数组的边界值 xc = 数组行数 - 1 (因为正常下标是从0开始的,而长度统计是比边界值+1的) yc = 数组列数 - 1 旋转90度 (x, y) -> (y, xc - x) 旋转180度 (
阅读全文
摘要:题目: 思路: 【1】模拟的方式(采用二维数组,模拟出数据的存放排列,再遍历合成) 【2】按照规律顺序的方式(根据规律逐个放置于新数组中) 代码展示: //时间80 ms 击败 5.4% //内存53.1 MB 击败 5.1% class Solution { public String conve
阅读全文
摘要:题目: 思路: 【1】题目要求的是所有字符串的最长公共前缀,那么对应的这个公共前缀必然不可能大于最短的字符串。所以要遍历的字符个数也就被限制了(不会出现数组越界的情况)。其次只有全部字符串都匹配某个字符才会被纳入到前缀里面,如果一旦出现不匹配的情况,那么后面的就不需要遍历了。 代码展示: //时间0
阅读全文
摘要:题目: 思路: 【1】由于矩阵大小固定,而且数值也是固定的范围,采用int数组,以下标来替代值,以值来表示个数,就可以清晰的知道该行,该列,或者该小矩阵是否出现过重复的数值,如 rows[2][3] = 2 , 则表示第二列中数值3出现了两次,基于每一列或者每一行中1-9都只会出现一次的条件就可以判
阅读全文
摘要:题目: 思路: 【1】既然找的是最后一个单词,那么正常的话肯定是反向遍历了会比较快(但是特殊情况,如把很多空格塞在最后的情况,这种情况如果太多了其实效率反倒是不如正向遍历),但是反向遍历的话肯定需要先排除不需要的字符,然后计算完第一个单词后就停下来,这种在正常情况下无疑是最优的。 代码展示: //时
阅读全文
摘要:题目: 思路: 【1】首先很重要的一点便是最后一个字符转成值必然是要加的,其次如果某个字符比下一个字符的值要小就是需要减的。 代码展示: //时间4 ms 击败 58.62% //内存42.3 MB 击败 49.45% class Solution { public int romanToInt(S
阅读全文
摘要:题目: 思路: 【1】多次遍历 主要是将规则进行拆分,分为 1)左规则:当 ratings[i−1]<ratings[i] 时,i 号学生的糖果数量将比 i−1 号孩子的糖果数量多。 2)右规则:当 ratings[i]>ratings[i+1] 时,i 号学生的糖果数量将比 i+1 号孩子的糖果数
阅读全文
摘要:题目: 思路: 【1】常规的方式(但是容易出现超时的现象) 【2】通过累计总油量-耗油量的方式判断 代码展示: 常规的方式: //时间复杂度:O(N^2),其中 N 为数组的长度。我们对数组进行了二次遍历。 //空间复杂度:O(1)。 //这种存在大量的重复遍历,而且一旦数据量庞大的话会导致耗费时间
阅读全文
摘要:题目: 思路: 【1】274. H 指数 【1.1】明确题目 该题目,主要是理解题意即可 条件:需要同时满足文章数>=h,且每篇文章的引用数>=h 如[3,0,6,1,5] 排序后为 [0,1,3,5,6] 可以发现引用数大于等于1的有4篇 可以发现引用数大于等于3的有3篇 可以发现引用数大于等于5
阅读全文
摘要:题目: 思路: 【1】如果采用辅助空间(这种是最简单的,因为需要遍历一遍,然后放入指定位置) 【2】对于进阶的处理,即只用空间复杂度为O(1) 【2.1】利用环的思维 其实这里需要理解一个比较绕的逻辑 就是从X位置开始循环,到回到X位置到底遍历了多少个元素 已知数组的元素个数是n,偏移量为k (这个
阅读全文
摘要:题目: 思路: 【1】26. 删除有序数组中的重复项的思路(双指针) 首先明确数组第一位是不会变动的,因为前面没有可以比较的元素 所以记录它的下标left可以作为比对元素的下标 其次当遍历整个数组的时候如果出现某个元素的数值与对比元素不同时 理应将该元素放置于比对元素的后面(即left+1的地方)
阅读全文
摘要:题目: 思路: 【1】121. 买卖股票的最佳时机的思路 【1.1】双指针的方式 本质上求得是右边某值减去左边某值的最大值是多少 所以双指针处理 输入示例:[7,1,5,3,6,4] 左指针left,右指针right一开始都是指向下标为0的数值 右指针right不断向右走 如当right = 1的时
阅读全文
摘要:题目: 思路: 【1】双指针的做法(这题类似于 11. 盛最多水的容器): 【2】动态规划(可以理解为双指针的基础版) 如图: 【3】 代码展示: 双指针的做法: //时间0 ms 击败 100% //内存43.7 MB 击败 6.18% //时间复杂度:O(n),其中 n 是数组 height 的
阅读全文
摘要:题目: 思路: 【1】采用快排中对元素进行互换的方式(双指针做法): 首先是要明确题目说什么 1.返回的是 数组长度 其次会根据数组长度输出对应的元素值 即数组为[3,2,2,3] 返回1,输出的是[3] 返回2,输出的是[3,2] 返回3,输出的是[3,2,2] 所以必须要对原本数组里面的不符合的
阅读全文
摘要:题目: 思路: 【1】无 代码展示: //时间10 ms 击败 75.48% //内存42.9 MB 击败 44.49% class Solution { public int calculate(String s) { Deque<Integer> ops = new LinkedList<Int
阅读全文
摘要:题目: 思路: 【1】无 代码展示: //时间1 ms 击败 97.94% //内存39.8 MB 击败 23.45% class Solution { public boolean isValid(String s) { Stack<Character> stack = new Stack<>()
阅读全文