diff --git a/top-interview-leetcode150/section/228汇总区间.js b/top-interview-leetcode150/section/228汇总区间.js new file mode 100644 index 0000000..5ad62c6 --- /dev/null +++ b/top-interview-leetcode150/section/228汇总区间.js @@ -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; +} diff --git a/top-interview-leetcode150/section/452引爆气球.js b/top-interview-leetcode150/section/452引爆气球.js new file mode 100644 index 0000000..b0073c4 --- /dev/null +++ b/top-interview-leetcode150/section/452引爆气球.js @@ -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; +} diff --git a/top-interview-leetcode150/section/56合并区间.js b/top-interview-leetcode150/section/56合并区间.js new file mode 100644 index 0000000..a9f4189 --- /dev/null +++ b/top-interview-leetcode150/section/56合并区间.js @@ -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; +} diff --git a/top-interview-leetcode150/section/57插入区间.js b/top-interview-leetcode150/section/57插入区间.js new file mode 100644 index 0000000..693a351 --- /dev/null +++ b/top-interview-leetcode150/section/57插入区间.js @@ -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; +}