二维数组自定义函数排序 + 栈:按二维数组自定义函数升序排序,使用栈合并区间,求解《56. 合并区间》和《剑指 Offer II 074. 合并区间》

2022-05-01 12:45:21
按二维数组自定义函数升序排序,使用栈合并区间,求解《56. 合并区间》和《剑指 Offer II 074. 合并区间》

可以合并的当前区间:上区间的结束 >= 当前区间的开始

二维数组 · 自定义函数排序 · 修改元数组

可以合并的区间

例题

56. 合并区间

剑指 Offer II 074. 合并区间


> 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

答案

排序 + 栈

var merge = function(intervals) {
  intervals.sort((a, b) => a[0] - b[0])
  const n = intervals.length, r = []
  for (let i = 0; i < n; i++) {
    if (r.length && r[r.length - 1][1] >= intervals[i][0]) 
      r[r.length - 1][1] = Math.max(r[r.length - 1][1], intervals[i][1])
    else
      r.push(intervals[i])
  }
  return r
};
func merge(intervals [][]int) [][]int {
  sort.Slice(intervals, func(i, j int) bool {
    return intervals[i][0] < intervals[j][0]
  })
  var r [][]int
  for _, interval := range intervals {
    n := len(r)
    if n > 0 && r[n - 1][1] >= interval[0] {
      r[n - 1][1] = max(r[n - 1][1], interval[1])
    } else {
      r = append(r, interval)
    }
  }
  return r
}
func max(a int, b int) int {
  if a > b {
    return a
  }
  return b
}
class Solution {
  function merge($intervals) {
    usort($intervals, function($a, $b) {
      return $a[0] - $b[0];
    });
    $r = [];
    foreach ($intervals as $interval) {
      $n = count($r);
      if ($n && end($r)[1] >= $interval[0])
        $r[$n - 1][1] = max(end($r)[1], $interval[1]);
      else 
        $r []= $interval;
    }
    return $r;
  }
}

5 种方法交换变量,用绝对值和求模标记,用位图、掩码、哈希集合、哈希映射、正则、排序和暴力法:求解《442. 数组中重复的数据》
利用 5 种方法交换变量,用绝对值和求模标记,用位图、掩码、哈希集合、哈希映射、正则、排序和暴力法求解《442. 数组中重复的数据》
二分查找(对数运算 + 前缀和),滑动窗口:求解《713. 乘积小于 K 的子数组》
根据对数运算性质将相乘转为求和问题,用前缀和优化。二分查找,滑动窗口,求解《713. 乘积小于 K 的子数组》
自定义排序:求解《937. 重新排列日志文件》
自定义排序和 Golang 的字符串分割函数,求解《937. 重新排列日志文件》