路径总和
路径总和
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。叶子节点 是指没有子节点的节点。
输入:root = [1,2,3], targetSum = 5
输出:false
解释:树中存在两条根节点到叶子节点的路径:(1 –> 2): 和为 3(1 –> 3): 和为 4不存在 sum = 5 的根节点到叶子节点的路径。
输入:root = [], targetSum = 0
输出:false
解释:由于树是空的,所以不存在根节点到叶子节点的路径。
12345678910111213141516171819202122232425var hasPathSum = function(root, targetSum) {if(root === null) return false; let nodeArr = [root]; let valArr = [ ...
杨辉三角 II
杨辉三角 II
给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。
输入: rowIndex = 3
输出: [1,3,3,1]
输入: rowIndex = 0
输出: [1]
12345678910var getRow = function(rowIndex) { let res = [1] for (let i = 1; i <= rowIndex + 1; i ++) { res[i - 1] = 1 // 扩充一位到 length 等于 rowIndex + 1 for (let j = i - 2; j > 0; j --) { // 从后往前更新数据, 倒数第二位(索引为 length - 2)至第一位 (索引为 1) res[j] = res[j - 1] + res[j] // 本位置上一轮值 + 前一位置上一轮值 } } r ...
加一
加一
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。
输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。
输入:digits = [4,3,2,1]
输出:[4,3,2,2]
解释:输入数组表示数字 4321。
1234567891011121314var plusOne = function(digits) { let i = digits.length - 1; while (digits[i] !== undefined && digits[i] === 9) { digits[i] = 0 i--; } if(i === -1) { digits.unshift(1) }else { digits[i] = ++digits[i] } return digi ...
杨辉三角
杨辉三角
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。
输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
输入: numRows = 1
输出: [[1]]-
123456789101112131415var generate = function(numRows) { let res = [] let orgin = [1] res.push(orgin) for (let i = 0; i < numRows - 1; i++) { // 创建虚拟数组,方便获取计算下一个数组 let node = [0, ...res[i], 0] let nextArr = [] for (let i = 0; i < node.length - 1; i++) { nextArr.pu ...
丢失的数字
丢失的数字
给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。
输入:nums = [3,0,1]
输出:2
解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。
输入:nums = [0,1]
输出:2
解释:n = 2,因为有 2 个数字,所以所有的数字都在范围 [0,2] 内。2 是丢失的数字,因为它没有出现在 nums 中。-
12345678910var missingNumber = function(nums) { let len = nums.length let addAll = 0 let i=0 while (len > i) { addAll = addAll + nums[i] i = i+1 } return (len+1)*len/2-addAll};
单词拆分
单词拆分
给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。
输入: s = “leetcode”, wordDict = [“leet”, “code”]
输出: true
解释: 返回 true 因为 “leetcode” 可以由 “leet” 和 “code” 拼接成。
输入: s = “applepenapple”, wordDict = [“apple”, “pen”]
输出: true
解释: 返回 true 因为 “applepenapple” 可以由 “apple” “pen” “apple” 拼接成。注意,你可以重复使用字典中的单词。-
12345678910111213var wordBreak = function(s, wordDict) { // dp数组,表示前index为能否被拆分 let dp = new Array(s.length + 1).fill(false); // ...
三除数
三除数
给你一个整数 n 。如果 n 恰好有三个正除数 ,返回 true ;否则,返回 false 。如果存在整数 k ,满足 n = k * m ,那么整数 m 就是 n 的一个 除数 。
输入:n = 2
输出:false
解释:2 只有两个除数:1 和 2 。
输入:n = 4
输出:true
解释:4 有三个除数:1、2 和 4 。-
12345var isThree = function(n) { let set = new Set([4, 9, 25, 49, 121, 169, 289, 361, 529, 841, 961, 1369, 1681, 1849, 2209, 2809, 3481, 3721, 4489, 5041, 5329, 6241, 6889, 7921, 9409]) if(set.has(n))return true else return false};
数组拆分
数组拆分
给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), …, (an, bn) ,使得从 1 到 n 的 min(ai, bi) 总和最大。返回该 最大总和 。
输入:nums = [1,4,3,2]
输出:4
解释:所有可能的分法(忽略元素顺序)为:
(1, 4), (2, 3) -> min(1, 4) + min(2, 3) = 1 + 2 = 3
(1, 3), (2, 4) -> min(1, 3) + min(2, 4) = 1 + 2 = 3
(1, 2), (3, 4) -> min(1, 2) + min(3, 4) = 1 + 3 = 4所以最大总和为 4示例 2:
输入:nums = [6,2,6,5,1,2]
输出:9
解释:最优的分法为 (2, 1), (2, 5), (6, 6). min(2, 1) + min(2, 5) + min(6, 6) = 1 + 2 + 6 = 9
1234567891011121314var arrayPairSum ...
数组的度
数组的度
给定一个非空且只包含非负数的整数数组 nums,数组的 度 的定义是指数组里任一元素出现频数的最大值。在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。
输入:nums = [1,2,2,3,1]
输出:2
解释:输入数组的度是 2 ,因为元素 1 和 2 的出现频数最大,均为 2 。连续子数组里面拥有相同度的有如下所示:[1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]最短连续子数组 [2, 2] 的长度为 2 ,所以返回 2 。
输入:nums = [1,2,2,3,1,4,2]
输出:6
解释:数组的度是 3 ,因为元素 2 重复出现 3 次。所以 [2,2,3,1,4,2] 是最短子数组,因此返回 6 。-
12345678910111213var findShortestSubArray = function(nums) { const count = []; for (let i = 0; i < ...
独一无二的出现次数
独一无二的出现次数
给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。
输入:arr = [1,2,2,1,1,3]
输出:true
解释:在该数组中,1 出现了 3 次,2 出现了 2 次,3 只出现了 1 次。没有两个数的出现次数相同。
输入:arr = [1,2]
输出:false-
12345678910111213141516var uniqueOccurrences = function(arr) { let obj={} for(let i=0;i<arr.length;i++){ obj[arr[i]]=obj[arr[i]]?obj[arr[i]]+1:1 } let newArr=new Array(1000) for(key in obj){ if(newArr[obj[key]]==obj[key]){ ...