随笔分类 - leetcode刷题笔记
摘要:一、题目 给定一个整型数组arr[L...R],元素代表不同的纸牌,2个玩家依次拿走每张纸牌(只能最左或者最右边)请返回最后获胜者的分数 二、思路 1.自然尝试: 对于先手而言,如果先拿L,那么先手在L+1到R上就是后手了;如果先拿R,那么先手在L到R-1上就是后手了。 先手当然拿的是这两种情况的m
阅读全文
摘要:一、题目 给你两个版本号字符串 version1 和 version2 ,请你比较它们。版本号由一个或多个修订号组成,各修订号由一个 '.' 连接。 二、思路 1.先将字符串按 '.' 分割成一个个数组元素 2.遍历数组元素,并设置边界条件 3.将在边界条件范围内的元素转为整数,方便比较大小 三、程
阅读全文
摘要:一、题目 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 二、思路 冒泡排序,返回第nums.length-k个位置的元素 三、程序实现 /** * @param {number[]} num
阅读全文
摘要:一、题目 给你一个整数数组 arr,只有可以将其划分为三个和相等的 非空 部分时才返回 true,否则返回 false。 形式上,如果可以找出索引 i + 1 < j 且满足 (arr[0] + arr[1] + ... + arr[i] == arr[i + 1] + arr[i + 2] + .
阅读全文
摘要:一、题目 合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值; 否则,不为 null 的节点将直接作为新二叉树的节点。返回合并后的二叉树。 二、思路 1.如果一棵树为空,另外一棵树不为空,直接覆盖 2.两棵树都有节点,叠加节点值。采用深度优先遍历方式 三、程序实现 var
阅读全文
摘要:一、题目 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串的长度。 二、思路 利用数组解题,循环将重复字母之前的都删掉,不断更新最长子串 三、程序实现 /** * @param {string} s * @return {number} */ var lengthOfLongestSub
阅读全文
摘要:一、题目 给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字(0-9)。 请你将两个数相加,并以相同形式返回一个表示和的链表。 二、思路 1.生成一个虚拟dummy头节点 2.链表中节点的值:sum%10 3.进位标志flag:sum/10 三
阅读全文
摘要:一、题目 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 二、思路 1.将第一天初始化为最佳买入点 2.如果股票下跌,不
阅读全文
摘要:一、思路 1.中序遍历的顺序是先访问左子树、再访问根节点、最后访问右子树 2.采用递归实现 二、程序实现 var inorderTraversal = function(root) { let res=[]; //中序递归遍历函数 var inorder=(root)=>{ if(!root){ r
阅读全文
摘要:一、题目 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。 例如输入字符串"I am a student. ",则输出"student. a am I"。 二、思路 1.先将字符串以空格分割成单词,存入到数组中并翻转数组。arr=s.split
阅读全文
摘要:一、思路 集合法,先遍历第一个链表,将节点放入集合,然后遍历第二个链表判断其节点是否在集合中. 二、程序实现 var getIntersectionNode = function(headA, headB) { const set=new Set(); let tempA=headA; while(
阅读全文
摘要:一、题目 输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 输入: nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 二、思路 1.动态规划:解决子问题,寻找最优解的一个过程。递归+记忆化思想 2.memo[ ]累加和记忆化数组,进行动态规
阅读全文
摘要:一、题目 在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。 二、思路 1.indexOf()函数查找字符在字符串中首先出现的位置 2.lastIndexOf() 函数查找字符在字符串中最后出现的位置 3.如果位置相等,则该字符只出现过一次 三、程序实现 v
阅读全文
摘要:一、题目 输入整数数组 arr ,找出其中最小的 k个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。 二、思路 1.对数组进行排序,前k个数就是最小的数,利用slice(start,end)方法,将前k个数分割出来 2.slice(start,end)方法
阅读全文
摘要:一、题目 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字 二、思路 对数组进行排序,出现次数超过一半的元素一定在中间也出现 三、程序实现 var majorityElement = function(nums) { //将数组排序 nums.sort((a,b)=>a-b); //向上
阅读全文
摘要:一、快速排序思路 1.选定一个基准元素,将数组分割成两个子数组,其中一个子数组的值小于基准元素, 另外一个子数组值大于等于基准元素。 2.对子数组进行递归调用实现方法一 二、程序实现 function quick(arr) { if (arr.length <= 1) { return arr; }
阅读全文
摘要:一、题目 请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的 例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 二、思路 1.首先判断根节点是否为空,空二叉树是对称的 2.根节点不为空,定义一个检测函数 { 检测左右子树是否为空的两种情况 :都为空、
阅读全文
摘要:一、题目 请完成一个函数,输入一个二叉树,该函数输出它的镜像。 二、思路 首先判断二叉树是否为空,递归遍历左右子树,将结果进行交换 三、程序实现 var mirrorTree = function(root) { if(!root){ return null; } //递归遍历左右子树 let le
阅读全文
摘要:一、题目 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。 二、思路 1.创建一个dummy虚拟节点,定义一个遍历指针curr指向dummy 2.设置l1与l2都不为空的边界条件,比较链表l1与链表l2的值,将值小的节点赋给curr的next,移动l1或者l2, 条件判断完
阅读全文
摘要:一、题目 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 二、思路 1.传统方法 定义三个指针变量,pre(指向当前遍历指针的前一个节点),temp(在断开之前记录当前节点的next),curr(当前遍历指针), 令curr的next往前指向pre,然后pre与curr往前
阅读全文