feat: 区间操作56,57,228,452
This commit is contained in:
parent
72ac2258de
commit
e0ea622d45
38
top-interview-leetcode150/section/228汇总区间.js
Normal file
38
top-interview-leetcode150/section/228汇总区间.js
Normal 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;
|
||||
}
|
38
top-interview-leetcode150/section/452引爆气球.js
Normal file
38
top-interview-leetcode150/section/452引爆气球.js
Normal 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;
|
||||
}
|
26
top-interview-leetcode150/section/56合并区间.js
Normal file
26
top-interview-leetcode150/section/56合并区间.js
Normal 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;
|
||||
}
|
45
top-interview-leetcode150/section/57插入区间.js
Normal file
45
top-interview-leetcode150/section/57插入区间.js
Normal 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;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user