随笔分类 -  leetcode题目

记录leetcode刷题做题笔记
摘要:题目: 思路: 【1】其实也没什么好思考的,题目给的数组就是山脉数组,可以理解为是有序的,其次,提示的复杂度就是叫你如何用二分去处理有序数组。 代码展示: //时间复杂度O(N)的方式 //时间0 ms击败100% //内存41.6 MB击败67.49% class Solution { publi 阅读全文
posted @ 2023-03-01 16:09 忧愁的chafry 阅读(13) 评论(0) 推荐(0) 编辑
摘要:题目: 思路: 【1】个人理解: 体力值 10 15 20 水平线 0 1 2 天台 1.也就是说天台其实算是数组溢出一位来着。 2.可以选择0或者1位索引的阶梯为初始阶梯 3.一次最多可以跨两步,而且花费的体力为离开该位置的体力,如无论从0到1,还是从0到2,所花费的体力都是arr【0】 【2】模 阅读全文
posted @ 2023-03-01 15:52 忧愁的chafry 阅读(18) 评论(0) 推荐(0) 编辑
摘要:题目: 思路: 【1】话不多说这道题本身暴力破解是可以过的,而且基于限制为Integer.MAX_VALUE,所以可以知道根号为46341,那么基于这个进行遍历就好了。 【2】基于二分进行优化,因为从暴力破解这里我们看到了,不一定需要遍历那么多数据,所以筛选数据快的方式不就是二分吗,一下子过掉一半的 阅读全文
posted @ 2023-03-01 15:34 忧愁的chafry 阅读(12) 评论(0) 推荐(0) 编辑
摘要:题目: 思路: 【1】其实最简单的便是计数排序,先将全部按照map进行映射,然后根据第二个数组的顺序先塞,最后的把剩下的再塞进去。 【2】当然还有一种自定义排序的方式,只能说有点秀。 由于数组arr2​ 规定了比较顺序,因此我们可以使用哈希表对该顺序进行映射: 即对于数组 arr2 中的第 i 个元 阅读全文
posted @ 2023-03-01 12:30 忧愁的chafry 阅读(13) 评论(0) 推荐(0) 编辑
摘要:题目: 思路: 【1】基于回文字符串的思维,采用双指针,如果字符相同就两个都移动,那么如果不同呢,那么就是要才去其中一个去除掉。其实用递归比较合适,只要设置一个标志位就可以了(可以考虑int类型),哈哈,如果变化成删除多个,就改一下标志位。 代码展示: 基于回文字符串思维的方式: //时间4 ms击 阅读全文
posted @ 2023-03-01 11:44 忧愁的chafry 阅读(24) 评论(0) 推荐(0) 编辑
摘要:题目: 思路: 【1】利用内置函数的方式 【2】利用双指针的方式,因为本质上就是回文字符串两边是相等的。 【3】基于双指针上面做位运算进行优化加快效率 【基于位运算的大小写转换技巧】 观察如下四个字母的ASCII码值。 'A': 65 = 1000001 'a': 97 = 1100001 'Z': 阅读全文
posted @ 2023-02-28 18:24 忧愁的chafry 阅读(12) 评论(0) 推荐(0) 编辑
摘要:题目: 思路: 【1】先汇总再计算,先得到总数,再根据左边的累加数*2+当前值如果等于总数即判断成功。 代码展示: 先汇总再计算: //时间0 ms击败100% //内存42 MB击败73% //时间复杂度:O(n),其中 n 为数组的长度。 //空间复杂度:O(1) class Solution 阅读全文
posted @ 2023-02-28 17:32 忧愁的chafry 阅读(15) 评论(0) 推荐(0) 编辑
摘要:题目: 思路: 【1】两道题很相似,一个算下标是从0开始,一个是从1开始,这就是区别之处 【2】思路:暴力双循环,然后可以优化的就是在暴力之上又做二分,但将复杂度由O(N^2)降为了O(nlogn) 【3】但是更优的是利用有序数组这个条件,采用双指针,因为但和小的时候必然向右移,当和大的时候必然左移 阅读全文
posted @ 2023-02-28 16:49 忧愁的chafry 阅读(11) 评论(0) 推荐(0) 编辑
摘要:题目: 思路: 【1】动态规划 【2】递归的方式 代码展示: 递归的方式(但是性能不佳): //时间93 ms击败5.3% //内存41.6 MB击败6.94% class Solution { public boolean isMatch(String s, String p) { // 如果字符 阅读全文
posted @ 2023-02-27 14:58 忧愁的chafry 阅读(11) 评论(0) 推荐(0) 编辑
摘要:题目: 思路: 【1】采用深度遍历的方式 【2】采用广度遍历的方式 代码展示: 采用广度遍历的方式: //时间3 ms击败6.94% //内存41.7 MB击败74.94% //时间复杂度:O(N^2),其中 N 是树的节点数。 //空间复杂度:O(N),其中 N 是树的节点数。空间复杂度主要取决于 阅读全文
posted @ 2023-02-27 13:27 忧愁的chafry 阅读(16) 评论(0) 推荐(0) 编辑
摘要:题目: 思路: 【1】大小顶堆的方式(优先队列): 【2】有序集合 + 双指针(差不多就是采用双指针加有序集合模拟两个堆的感觉) 代码展示: 有序集合 + 双指针的方式: class MedianFinder { // 第一个Integer存放数值 第二个Integer存放该数值的个数 TreeMa 阅读全文
posted @ 2023-02-24 16:29 忧愁的chafry 阅读(20) 评论(0) 推荐(0) 编辑
摘要:题目: 思路: 【1】暴力是比较容易超时的,然后我有考虑使用堆排序,貌似不太行,排完序,还是需要多次遍历。 【2】使用归并算法 代码展示: 基于归并排序的方式: //时间35 ms击败25.1% //内存49 MB击败71.27% //时间复杂度:同归并排序 O(nlog⁡n)。 //空间复杂度:同 阅读全文
posted @ 2023-02-24 15:34 忧愁的chafry 阅读(11) 评论(0) 推荐(0) 编辑
摘要:题目: 思路: 【1】逐次统计个位、十位、百位......1出现的次数,做和即可 代码展示: //时间0 ms击败100% //内存38 MB击败90.14% class Solution { public int countDigitOne(int n) { int ans = 0; long b 阅读全文
posted @ 2023-02-24 10:53 忧愁的chafry 阅读(9) 评论(0) 推荐(0) 编辑
摘要:题目: 思路: 【1】看到这里,我首先想到的是使用队列来完成,因为用一个辅助空间存储最大值即可,思路可以参考 面试题59 - II. 队列的最大值 。里面内容很相似,问如果每次往对里面添加数据,然后可以通过某个函数获取到里面的最大值。当然有用双循环的方式其实是都可以做的,但是这样耗时会更大,因为需要 阅读全文
posted @ 2023-02-23 12:29 忧愁的chafry 阅读(13) 评论(0) 推荐(0) 编辑
摘要:题目: 思路: 【1】利用递归的方式【这种其实是最好理解的】 对于任意一颗树而言,前序遍历的形式总是【根节点总是前序遍历中的第一个节点】: [ 根节点, [左子树的前序遍历结果], [右子树的前序遍历结果] ] 中序遍历的形式总是: [ [左子树的中序遍历结果], 根节点, [右子树的中序遍历结果] 阅读全文
posted @ 2023-02-22 13:56 忧愁的chafry 阅读(12) 评论(0) 推荐(0) 编辑
摘要:题目: 思路: 【1】简单暴力的方式就是全遍历,使用辅助空间Map记录所有节点的,然后根据其中一个节点,将其链条内的节点【即从根目录】都塞入Set中,然后第二个节点也如一样的方式,当第一个出现的共同父节点既是公共先祖。 【2】使用递归的方式:可以判断出根据两个子节点的返回值 【3】构建示例代码: 构 阅读全文
posted @ 2023-02-22 12:15 忧愁的chafry 阅读(17) 评论(0) 推荐(0) 编辑
摘要:题目: 思路: 【1】首先这题不难,难的是对题目的理解,说的很绕,但是很简单:就是节点p 和 q遇到的第一个将它们分在两边的节点,就是公共先祖。 代码展示: //时间5 ms击败100% //内存42.4 MB击败71.74% //时间复杂度:O(n),其中 nnn 是给定的二叉搜索树中的节点个数。 阅读全文
posted @ 2023-02-21 11:05 忧愁的chafry 阅读(10) 评论(0) 推荐(0) 编辑
摘要:题目: 思路: 【1】感觉考察的是对函数的内置逻辑的理解和重点思考如何使用java写出空间复杂度为O(n)的算法。 代码展示: //时间8 ms击败31.44% //内存41.6 MB击败29.24% //利用函数的写法,巨简洁 class Solution { public String reve 阅读全文
posted @ 2023-02-20 14:58 忧愁的chafry 阅读(16) 评论(0) 推荐(0) 编辑
摘要:题目: 思路: 【1】这道题本身有点类似于判断是否为(101. 对称二叉树) ,不过本身的话其实也是考虑能不能在原本的节点上变化,还是必须要开一棵新树。而且基于递归的方式是最简单的,虽然容易造成递归层次很深,但是用循环遍历树有些情况确实不好搞。 代码展示: //时间0 ms击败100% //内存39 阅读全文
posted @ 2023-02-20 11:53 忧愁的chafry 阅读(11) 评论(0) 推荐(0) 编辑
摘要:题目: 思路: 【1】递归便是最简单的处理方法,首先头结点是要不等于null就可以了,然后将两个节点当做新的头结点进行判断。 【2】迭代的方式(相当于利用循环替代递归) 代码展示: 迭代的方式: //时间1 ms击败21.98% //内存40.9 MB击败5% //时间复杂度:O(n)。 //空间复 阅读全文
posted @ 2023-02-17 17:08 忧愁的chafry 阅读(11) 评论(0) 推荐(0) 编辑