feat: 区间操作56,57,228,452

This commit is contained in:
LouisFonda 2025-04-19 18:07:59 +08:00
parent 72ac2258de
commit e0ea622d45
Signed by: yigencong
GPG Key ID: 29CE877CED00E966
4 changed files with 147 additions and 0 deletions

View File

@ -0,0 +1,38 @@
/**
* https://leetcode.cn/problems/summary-ranges/?envType=study-plan-v2&envId=top-interview-150
* @param {number[]} nums
* @return {string[]}
*/
const summaryRanges = function (nums) {
};
/*
思路定义两个指针一个指针表示区间的开头一个表示区间的结尾用left和right表示right扫描连续区间如果发现不
再连续就把left和right表示的连续区间加入到结果集
*/
function f1(nums) {
const result = [];
let left = 0;
while (left < nums.length) {
let right = left;
// 扫描连续区间
while (right + 1 < nums.length && nums[right + 1] === nums[right] + 1) {
right++;
}
// 查看left和right是否相等如果相等则这个区间只有一个数否则是一个完整的区间需要用left->right表示
if (left === right) {
result.push(`${nums[left]}`);
} else {
result.push(`${nums[left]}->${nums[right]}`);
}
// 区间统计完毕,统计下一个区间
left = right + 1;
}
return result;
}

View File

@ -0,0 +1,38 @@
/**
* https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/?envType=study-plan-v2&envId=top-interview-150
* @param {number[][]} points
* @return {number}
*/
const findMinArrowShots = function (points) {
};
/*
将points按照start排序从第一个point开始遍历所射箭的位置取第一个point的end之后查看第二个point
如果第二个point的end比第一个point的end小就把箭的x坐标移动到第二个point的end这样就能保证之前气球
引爆的情况下也能引爆当前气球可以做到箭的作用的最大化如果之前最小的end比当前point还小则表明需要
新增一直箭
*/
function f1(points) {
if (points.length === 0) return 0;
// 按照气球的左边界进行排序
points.sort((a, b) => a[0] - b[0]);
let arrows = 1; // 初始化箭的数量
let arrowX = points[0][1]; // 第一个箭的位置是第一个气球的右边界
for (let i = 1; i < points.length; i++) {
// 如果当前气球的左边界大于箭的位置,说明需要新的箭
if (arrowX < points[i][0]) {
arrows++; // 增加箭
arrowX = points[i][1]; // 更新箭的位置为当前气球的右边界
} else {
// 否则,箭可以继续覆盖当前气球,更新箭的位置为当前气球的右边界(确保尽量覆盖更多气球)
arrowX = Math.min(arrowX, points[i][1]);
}
}
return arrows;
}

View File

@ -0,0 +1,26 @@
/**
* https://leetcode.cn/problems/merge-intervals/?envType=study-plan-v2&envId=top-interview-150
* @param {number[][]} intervals
* @return {number[][]}
*/
const merge = function (intervals) {
};
/*
思路先对intervals按照左区间进行排序之后遍历所有区间如果当前区间在result中不存在就把它加入到
reslut中如果result中存在区间并且result的最后一个区间的右区间小于当前区间的左区间直接把当前区间加入
到reslut否则合并区间右边界取两个区间中较大的值
*/
function f1(intervals) {
intervals.sort((a, b) => a[0] - b[0]); // 按照左区间从小到大排序
const result = [];
for (let i = 0; i < intervals.length; i++) {
if (result.length === 0 || result[result.length - 1][1] < intervals[i][0]) {
result.push(intervals[i]);
} else {
result[result.length - 1][1] = Math.max(result[result.length - 1][1], intervals[i][1]);
}
}
return result;
}

View File

@ -0,0 +1,45 @@
/**
* http://leetcode.cn/problems/insert-interval/?envType=study-plan-v2&envId=top-interview-150
* @param {number[][]} intervals
* @param {number[]} newInterval
* @return {number[][]}
*/
const insert = function (intervals, newInterval) {
};
/*
假设我们插入的区间是[left, right][start, end]表示当前元素的左右区间由于intervals的所有区间都是
按照左区间排序的当end小于left时表明新插入的区间和当前区间没有重合没必要合并就把当前区间存入result
如果当start大于right时表明这两个区间没有重合也不需要合并其他情况需要合并区间合并的区间为[min(start,left), max(end, right)]
*/
function f1(intervals, newInterval) {
const result = [];
let i = 0;
const n = intervals.length;
// 1. 插入所有与 newInterval 不重叠的区间
while (i < n && intervals[i][1] < newInterval[0]) {
result.push(intervals[i]);
i++;
}
// 2. 合并重叠的区间
while (i < n && intervals[i][0] <= newInterval[1]) {
newInterval[0] = Math.min(newInterval[0], intervals[i][0]);
newInterval[1] = Math.max(newInterval[1], intervals[i][1]);
i++;
}
// 3. 将合并后的 newInterval 插入到结果中
result.push(newInterval);
// 4. 插入剩余的所有区间
while (i < n) {
result.push(intervals[i]);
i++;
}
return result;
}