力扣 600 以后
617.合并二叉树
const mergeTrees = (t1, t2) => {
if (!t1) return t2;
if (!t2) return t1;
t1.val += t2.val;
t1.left = mergeTrees(t1.left, t2.left);
t1.right = mergeTrees(t1.right, t2.right);
return t1;
};
643.子数组最大平均数 I(滑动窗口)
/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
var findMaxAverage = function (nums, k) {
let sum = 0;
let len = nums.length;
for (let i = 0; i < k; i++) {
sum += nums[i];
}
let maxSum = sum;
for (let i = k; i < len; i++) {
sum = sum - nums[i - k] + nums[i];
maxSum = Math.max(maxSum, sum);
}
return maxSum / k;
};
662.二叉树最大宽度(bfs 每一层挑战)
由于要 考虑大数情况
左子*2n,右子*2n+1n
function widthOfBinaryTree(root) {
const queue = [[root, 1n]];
let max = -1;
while (queue.length) {
const size = queue.length;
// 当前层最右边的编号减去最左边的编号,012,2-1+1n
max = Math.max(max, Number(queue[queue.length - 1][1] - queue[0][1] + 1n));
for (let i = 0; i < size; i++) {
const [node, index] = queue.shift();
node?.left && queue.push([node.left, index * 2n]);
node?.right && queue.push([node.right, index * 2n + 1n]);
}
}
return max;
}
670.最大交换(贪心)
给定一个非负整数,你至多可以交换一次数字中的任意两位。返 回你能得到的最大值。
示例 1 :
输入: 2736 输出: 7236 解释: 交换数字 2 和数字 7。 示例 2 :
输入: 9973 输出: 9973 解释: 不需要交换。 注意:
通过以上可以观察到右边越大的数字与左边较小的数字进行交换,这样产生的整数才能保证越大。因此我们可以利用贪心法则,尝试将数字中右边较大的数字与左边较小的数字进行交换,这样即可保证得到的整数值最大。具体做法如下
var maximumSwap = function (num) {
const charArray = [...("" + num)];
const n = charArray.length;
let maxIdx = n - 1;
let idx1 = -1,
idx2 = -1;
for (let i = n - 1; i >= 0; i--) {
if (charArray[i] > charArray[maxIdx]) {
maxIdx = i;
} else if (charArray[i] < charArray[maxIdx]) {
idx1 = i;
idx2 = maxIdx;
}
}
if (idx1 >= 0) {
swap(charArray, idx1, idx2);
return parseInt(charArray.join(""));
} else {
return num;
}
};
const swap = (charArray, i, j) => {
const temp = charArray[i];
charArray[i] = charArray[j];
charArray[j] = temp;
};
674.最长连续递增序列
给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。
连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。
/**
* @param {number[]} nums
* @return {number}
*/
var findLengthOfLCIS = function (nums) {
let ans = 1;
const n = nums.length;
let start = 0;
// 连续递增,不行就清 掉,记得挑战最大值就行
for (let i = 0; i < n; i++) {
if (i > 0 && nums[i] <= nums[i - 1]) {
start = i;
}
ans = Math.max(ans, i - start + 1);
}
return ans;
};
695.岛屿的最大面积
/**
* @param {number[][]} grid
* @return {number}
*/
// 变0里面设let num=1,num+=(向左) num+=(向右)。。。。return num
// 双循环内部如果出现1要挑战最大值 count=Math.max(count,areaOfIsland(grid,i,j,y,x))
var maxAreaOfIsland = function (grid) {
let count = 0,
x = grid[0].length,
y = grid.length;
for (let i = 0; i < y; i++) {
for (let j = 0; j < x; j++) {
if (grid[i][j] === 1) count = Math.max(count, areaOfIsland(i, j));
}
}
return count;
function areaOfIsland(i, j) {
if (i >= y || i < 0 || j >= x || j < 0 || grid[i][j] === 0) return 0;
let num = 1;
grid[i][j] = 0;
num += areaOfIsland(i + 1, j);
num += areaOfIsland(i - 1, j);
num += areaOfIsland(i, j + 1);
num += areaOfIsland(i, j - 1);
return num;
}
};