随笔分类 - leetcode题目
记录leetcode刷题做题笔记
摘要:题目: 思路: 【1】动态规划的方式 动态规划的原理,如ababa为例 二维数组的情况大致是这样: [ a , b , a , b , a a:[true, false, true, false, true], b:[false, true, false, true, false], a:[fals
阅读全文
摘要:题目: 思路: 【1】剑指 Offer II 025. 链表中的两数相加(445. 两数相加 II【进阶版本】) 【1.1】链表相加,反转链表之后再相加其实是最为靠谱的 【1.2】基于进阶说不给反转,那么要么采用递归,从底层往上走。(要么就是全部取出值来形成字符串相加) 【2】2. 两数相加 代码展
阅读全文
摘要:题目: 思路: 【1】只能说这道题和 【剑指 Offer II 015. 字符串中的所有变位词(438. 找到字符串中所有字母异位词)】是一样的,逻辑都不用改,就该一下参数和返回值就可以了 【2】本质思路:利用滑动窗口加字符集数组的思想 【3】双指针的思路 代码展示: 双指针的思路: //时间2 m
阅读全文
摘要:题目: 思路: 【1】利用滑动窗口加字符集数组的思想(还有官方的题解真鸡儿复杂,感觉一样的思路,看到些那么多就没有看下去了) 代码展示: 利用滑动窗口加字符集数组的思想的方式: //时间7 ms击败75.57% //内存42.2 MB击败95.1% class Solution { public L
阅读全文
摘要:题目: 思路: 【1】基于暴力方式,采用双循环的方式【其实可以看做双指针】加上辅助记录空间,但是由于遍历是次方数的所以,其实效率感觉会比较低下,而且每一次遍历都需要开一个辅助空间,所以空间复杂度也高。 【2】进行了一波优化:采用队列的辅助空间,且只遍历一次,没遇到相同的就直接塞入队列,遇到相同的就将
阅读全文
摘要:题目: 思路: 【1】基于暴力的思想 【2】基于数据集的思想(基于 303. 区域和检索 - 数组不可变 这道题) 代码展示: 基于暴力的思想(这种是不进行初始化,而是用到了就进行遍历,虽然节约空间(也不是很大),但是如果次数多,就会发现需要的时间是基于数据集思想的数十乃至上百倍): //时间141
阅读全文
摘要:题目: 思路: 【1】利用左右汇总数据集的方式(当然做完后你会发现单个数据集其实也是可以的,毕竟一开始我以为是乘积) 代码展示: 对数据集的优化: //时间7 ms击败100% //内存44.1 MB击败75.81% class NumArray { private int[] sums; publ
阅读全文
摘要:题目: 思路: 【1】原本打算用双指针做个滑动窗口的,但是发现左指针的移动判断满是不好搞 【2】但是发现好像滑动窗口有点感觉的,但是解不出来用 前缀和 + 哈希表 貌似又能解 示例说明: //输入示例[0,0,1,0,0,0,1,1] //一开始边构建hash , [k=0 v=-1] //当下标为
阅读全文
摘要:题目: 思路: 【1】滑动窗口的双指针版本 代码展示: 双指针的方式: //时间4 ms击败100% //内存47.6 MB击败94.45% //时间复杂度:O(n),其中 n 是数组 nums 的长度。两个端点 left 和 right 的增加次数都不超过 n。 //空间复杂度:O(1)。 cla
阅读全文
摘要:题目: 思路: 【1】暴力破解,双循环遍历列举; 【2】前缀和 + 哈希表优化 这种解法是依据题目中的 连续子数组 这个条件 假设 b位置到a位置 的汇总和是符合条件的(b > a) 那么必然有 ( 0-b的汇总和) - (0-a的汇总和)= k 依据这种我们只需要知道差值的汇总和有多少个那么该位置
阅读全文
摘要:题目: 思路: 【1】貌似双循环是避不开,所以考虑的就是怎么进行快速比对,最优的就是在固定条件下用最少的空间辅助比对。 代码展示: //时间10 ms击败91.21% //内存42.2 MB击败94.62% class Solution { public int maxProduct(String[
阅读全文
摘要:题目: 思路: 【1】利用队列+单次遍历整个数组的方式来处理(这种就是模仿滑动窗口的思维) 首先要了解到本质: 因为需要知道 nums 中是否有 连续子数组 (这个要求很重点,是做窗口的前提) 能够使元素的汇总sum >= target 所以可以利用窗口的思维 而这个窗口,你可以理解为算是另一个存储
阅读全文
摘要:题目: 思路: 【1】从哈希表的角度入手:本质上这道题考察的就是检验两个字符串的字符是否相等,那么对应字符都是有编码的,根据编码为下标,s串中出现就是加,t串中出现就是减,如果字符是相等的,那么结果必然还是会是0,如果不等那么两个字符串的字符不相等(此外长度不一样一定不相等)。 【2】当然捞一点就是
阅读全文
摘要:题目: 思路: 【1】使用快慢指针找出中间,进行反转后再比较的方式(因为如果复原的话,是需要考虑后面还会不会用,其实不会用的话不复原都是可以的,毕竟好多都是直接在上面空间进行修改来节省空间) 【2】将值复制到数组中后用双指针法(这种就类似于处理回文字符串了) 【3】使用递归的方式 代码展示: 使用递
阅读全文
摘要:题目: 思路: 【1】使用辅助空间是我们最容易的想到的处理方式,先遍历一遍存起来,然后反转连起来(但明显不是最优的)。 【2】循环中不使用辅助空间的情况 需要定义两个指针,一个是tem临时存储,一个是pre头部节点的存储,加上本身的head(给予的树头节点) 如树为【5,4,3,2,1】 那么第一次
阅读全文
摘要:题目: 思路: 【1】首先这个里面需要记录最大容量,其次塞数据的存储可以考虑队列。那么如果数据超过最大容量就会从队列将前边的数据弹出,而每次平均数将是 队列里面数据的和 / 队列里面数据的个数。 【2】然后可以优化的点 代码展示: 优化代码(利用数组的环思维替代队列,可以减少开辟的空间,其次对数组的
阅读全文
摘要:题目: 思路: 【1】利用队列的形式 【2】快慢指针的思路(但这个思路局限于对场景的限制,首先限制了ping调用最多一万次,所以固定了填充的数组大小,如果没有限制呢,大体又是队列的模式了,或者环状也可以) //C++版本 class RecentCounter { public: array<int
阅读全文
摘要:题目: 思路: 【1】用优先队列实现堆的形式 代码展示: //时间15 ms击败19.10% //内存45.6 MB击败46.16% public class KthLargest { PriorityQueue<Integer> pq; int k; public KthLargest(int k
阅读全文
摘要:题目: 思路: 【1】思路1:对于树优先是遍历完全部,把数值拿出来(如中序遍历,形成数组后采用双指针就可以了判断了)。 【2】思路2:对于树优先是在遍历过程中,遍历的要存起来,且要判断差值是否已经存在了。 代码展示: 思路1的方式: //时间2 ms击败95.45% //内存42 MB击败46.20
阅读全文
摘要:题目: 思路: 【1】直接二分查找 代码展示: //时间0 ms击败100% //内存40.9 MB击败74.5% class Solution { public int searchInsert(int[] nums, int target) { int n = nums.length; int
阅读全文