之前的笔记中,有更新过力扣的题目,但都是按类型更新的(做了代码随想录分类的题目),这次是根据LeetCode热题100去做,会有重复题目。
53. 最大子数组和
思路
遍历数组中的item,依次相加,只要出现负数就清0重新相加;如果当前的和大于max,就更新最大值。
var maxSubArray = function(nums) {
if(nums.length === 1) return nums[0];
let sum = 0, max = -Infinity;
for(let i = 0; i < nums.length; i++) {
sum += nums[i];
if(max < sum) max = sum;
if(sum < 0) sum = 0;
}
return max;
};
112. 路径总和
思路
二叉树的题目大部分都使用递归。如果当前节点存在,就与当前路径和相加,直到叶子节点;
如果某一路径的和不等于目标值,会回退至上一节点的右节点继续相加。
var hasPathSum = function(root, targetSum) {
return checkNode(root, targetSum, 0);
};
const checkNode = (root, target, curSum) => {
if(root == null) return false;
curSum += root.val;
if (root.left !== null || root.right !== null) {
return checkNode(root.left, target, curSum)
|| checkNode(root.right, target, curSum)
}
return curSum == target;
}
116. 填充每个节点的下一个右侧节点指针
思路
左子节点的 next 指向右子节点,右子节点的 next 指向下一个兄弟节点的左子节点,每个节点都默认为null,因此无需赋值,只需要将左右子树连接即可。
var connect = function(root) {
if (!root) return null;
if (root.left) {
root.left.next = root.right;
if (root.next) {
root.right.next = root.next.left;
}
}
connect(root.left);
connect(root.right);
return root;
};
347. 前 K 个高频元素
思路
这里使用 Map,遍历数组中的 item,将当前的数字及它的出现次数 set 到 Map 中,如果这个数字已经存在于 Map 中,就 .get(num) 并 +1;如果是第一次出现这个数字就 0+1。因为 Map 是个键值对集合,此题是要根据出现次数大小排序,因此根据 Map 中的value(key 就是数字)从大到小进行排序,最后截取前k个即可。
var topKFrequent = function(nums, k) {
const numsMap = new Map();
for(const num of nums) {
numsMap.set(num, (numsMap.get(num) || 0) + 1);
}
const sorted = [...numsMap].sort((a, b) => b[1] - a[1]);
const res = sorted.slice(0, k).map(([num]) => num);
return res;
};
997. 找到小镇的法官
思路
这里我是用图论,法官的出度为0(不信任任何人),入度为 n-1(除了自己的所有人)。
定义一个 长度为 n+1 的数组,因为 trust 数组中的第一个人是1而不是0。
以 trust = [[1,3],[2,3]] 为例,trustCount 就是 [0, 0, 0, 0]
以 [a, b] 形式去遍历 trust 就可以遍历到每一个人,如果这个人被信任,那么这个人的入度增加(trustCount[b]++);如果这个人信任别人,那么这个人的出度增加(trustCount[a]--)。
最终只要找 trustCount 数组中与 n-1 相等的那个 item 即可。
var findJudge = function(n, trust) {
if(n === 1 && trust.length === 0) return 1;
const trustCount = new Array(n + 1).fill(0);
for(let [a, b] of trust) {
trustCount[a]--;
trustCount[b]++;
}
for(let i = 1; i <= n; i++) {
if(trustCount[i] == n - 1) return i;
}
return -1;
};