04 2022 档案

摘要:思路: 树用递归就对了。 相同的树定义是结点值相同,树的结构也相同。 有这么几种情况: 1. 结点都为null, 代表都是空结点,没问题。 2. 结点一个是null,一个不是null, 这种情况树的结构肯定是不同的。 3. 结点都为非空结点,这就要求结点值相同,然后递归的去比较左子树和右子树了。 代 阅读全文
posted @ 2022-04-08 13:46 BJFU-VTH 阅读(37) 评论(0) 推荐(0) 编辑
摘要:思路: 二叉树的中序遍历,没啥好说的,左-中-右即可。 代码: 1 /** 2 * @param {TreeNode} root 3 * @return {number[]} 4 */ 5 var inorderTraversal = function(root) { 6 function inOr 阅读全文
posted @ 2022-04-08 13:36 BJFU-VTH 阅读(24) 评论(0) 推荐(0) 编辑
摘要:思路: 题目要求了时间复杂度是O(n+m),没有要求空间复杂度。 所以可以先开一个数组,遍历O(n+m)生成一个新数组,然后把新数组的值复制给nums1即可。(代码一) 当然,也可以从后往前遍历,谁大谁放在n+m处,然后指针往前移动即可。(代码二) 代码一: 1 /** 2 * @param {nu 阅读全文
posted @ 2022-04-08 13:31 BJFU-VTH 阅读(31) 评论(0) 推荐(0) 编辑
摘要:思路: 意思就是把排序链表每个元素只留下一个,还要维持先后顺序。 这种题,可以用set来存储遍历过的元素来降低代码编写难度,但时空复杂度都是O(n)的。(代码一) 其实还可以用一个变量记住最后一个值是啥,来降低空间复杂度。空间O(1),时间O(n)。(代码二) 代码一: 1 var deleteDu 阅读全文
posted @ 2022-04-08 13:17 BJFU-VTH 阅读(26) 评论(0) 推荐(0) 编辑
摘要:思路: 仔细想想其实是有状态转移的。 你当前的台阶,可以从前一个格子走一步走到,也可以从前两个格子一步走两个格子走到。 假定f(n)的含义是走到第n个格子有多少种走法,那f(n) = f(n-1) + f(n-2)。 然后考虑边界条件,f(0)是什么,f(1)是什么,f(2)是什么,即可递推。 总之 阅读全文
posted @ 2022-04-07 13:40 BJFU-VTH 阅读(25) 评论(0) 推荐(0) 编辑
摘要:思路: 这题我只会二分,牛顿迭代法不适合我这种数学弱鸡。 还是那句话,为什么可以用二分? 因为答案是有序的。 代码: 1 /** 2 * @param {number} x 3 * @return {number} 4 */ 5 var mySqrt = function(x) { 6 let le 阅读全文
posted @ 2022-04-07 11:48 BJFU-VTH 阅读(25) 评论(0) 推荐(0) 编辑
摘要:思路: 跟十进制加法是一样的,只不过进位不是10而已。 其实代码可以精简一点。 但不想花精力干这个事儿了。 1 /** 2 * @param {string} a 3 * @param {string} b 4 * @return {string} 5 */ 6 var addBinary = fu 阅读全文
posted @ 2022-04-07 10:56 BJFU-VTH 阅读(28) 评论(0) 推荐(0) 编辑
摘要:思路: 模拟加法进位操作。 代码: 1 /** 2 * @param {number[]} digits 3 * @return {number[]} 4 */ 5 var plusOne = function(digits) { 6 let jinwei = 1; 7 for(let i = di 阅读全文
posted @ 2022-04-07 10:36 BJFU-VTH 阅读(28) 评论(0) 推荐(0) 编辑
摘要:思路: 被迫练了一把js的正则。然而发现性能不太行。后来读了读题发现可以更加优雅的解决。 代码: 1 /** 2 * @param {string} s 3 * @return {number} 4 */ 5 var lengthOfLastWord = function(s) { 6 // let 阅读全文
posted @ 2022-04-07 10:22 BJFU-VTH 阅读(20) 评论(0) 推荐(0) 编辑
摘要:思路: 这题可以用在线处理算法(另一种程度上的滑动窗口)。既然是最大数组和,那么如果curRes小于等于0了,那么它对于最大数组和是没有贡献的,可以drop掉。 代码: 1 /** 2 * @param {number[]} nums 3 * @return {number} 4 */ 5 var 阅读全文
posted @ 2022-04-07 10:04 BJFU-VTH 阅读(19) 评论(0) 推荐(0) 编辑
摘要:思路: 又是一个二分查找变种题目。 按照之前的文章总结的二分用法,套就完事儿了。 1 /** 2 * @param {number[]} nums 3 * @param {number} target 4 * @return {number} 5 */ 6 var searchInsert = fu 阅读全文
posted @ 2022-04-06 19:51 BJFU-VTH 阅读(20) 评论(0) 推荐(0) 编辑
摘要:思路: 这题没啥好说的,就当练习js的语法了吧。 1 var strStr = function(haystack, needle) { 2 // return haystack.search(needle); 3 // return haystack.indexOf(needle); 4 if(h 阅读全文
posted @ 2022-04-06 19:21 BJFU-VTH 阅读(26) 评论(0) 推荐(0) 编辑
摘要:思路: 这题和26题没有本质上的区别,甚至我觉得更简单。 代码: 1 var removeElement = function(nums, val) { 2 let realIndex = 0, i = 0; 3 while(i < nums.length){ 4 if(nums[i] !== va 阅读全文
posted @ 2022-04-06 19:12 BJFU-VTH 阅读(24) 评论(0) 推荐(0) 编辑
摘要:思路: 这题设置一个real指针,然后遍历就好了。记得遍历的时候筛选出来唯一的一个值。 一种比较优雅的写法就是我这种了(自卖自夸一下)。 1 var removeDuplicates = function(nums) { 2 let real_index = 0, i = 0; 3 while(i 阅读全文
posted @ 2022-04-06 18:49 BJFU-VTH 阅读(22) 评论(0) 推荐(0) 编辑
摘要:思路: 由于两个链表本身就是有序的,所以只需要遍历就OK了。 可以设置一个空的头结点,这样可以对两条链表都进行统一的操作,减轻代码量,代码也美观了不少。 代码: 1 /** 2 * @param {ListNode} list1 3 * @param {ListNode} list2 4 * @re 阅读全文
posted @ 2022-04-06 18:38 BJFU-VTH 阅读(78) 评论(0) 推荐(0) 编辑
摘要:思路: 这题没啥好说的,用栈模拟就行了,记得最后判断一下栈是不是空的。 代码: 1 /** 2 * @param {string} s 3 * @return {boolean} 4 */ 5 var isValid = function(s) { 6 let couple_dic = { 7 '[ 阅读全文
posted @ 2022-04-06 13:29 BJFU-VTH 阅读(19) 评论(0) 推荐(0) 编辑
摘要:思路: 这题是找最长的公共前缀。 既然是公共前缀,那长度最大也就是这个字符串列表中最短的那个字符串的长度。 一个朴素的思路就是先假定这个最大长度是1,然后不断的增加长度,求出来最长的公共前缀。但是这样算法复杂度太高了。是O(n2)的. 另外一个思路就是二分。下标是有序的,且会出现一个临界值,使得st 阅读全文
posted @ 2022-04-06 13:18 BJFU-VTH 阅读(51) 评论(0) 推荐(0) 编辑
摘要:这题规则看似比较复杂,其实好好梳理一下也就这么几种情况。 按照两个字符和一个字符分好类,建立一个hashtable,然后打表就行了。 注意先打2个字符的表,命中不了再打1个字符的。(因为如果打一个字符的肯定能命中,这样会遗漏两个字符的情况) 代码: 1 /** 2 * @param {string} 阅读全文
posted @ 2022-04-06 11:03 BJFU-VTH 阅读(21) 评论(0) 推荐(0) 编辑
摘要:代码: 1 var isPalindrome = function(x) { 2 let str_x = x.toString(); 3 for(let i = 0; i < Math.floor(str_x.length/2); i++){ 4 if(str_x.charAt(i) !== str 阅读全文
posted @ 2022-04-02 17:53 BJFU-VTH 阅读(26) 评论(0) 推荐(0) 编辑
摘要:代码: 1 var twoSum = function(nums, target) { 2 let mem = new Map(); 3 for(let i = 0; i < nums.length; i++){ 4 if(mem.has(target-nums[i])){ 5 return [me 阅读全文
posted @ 2022-04-02 17:43 BJFU-VTH 阅读(25) 评论(0) 推荐(0) 编辑