Day 31: 贪心算法基础 V

56. 合并区间

本题也是重叠区间问题,如果昨天三道都吸收的话,本题就容易理解了。

给出一个区间的集合,请合并所有重叠的区间。

示例 1:

  • 输入: intervals = \[1,3,2,6,8,10,15,18]
  • 输出: \[1,6,8,10,15,18]
  • 解释: 区间 1,32,6 重叠, 将它们合并为 1,6.

示例 2:

  • 输入: intervals = \[1,4,4,5]
  • 输出: \[1,5]
  • 解释: 区间 1,44,5 可被视为重叠区间。
  • 注意:输入类型已于2019年4月15日更改。 请重置默认代码定义以获取新方法签名。
TypeScript 复制代码
function merge(intervals: number[][]): number[][] {
    intervals.sort((a, b) => a[0] - b[0]);
    let results: number[][] = [intervals[0]];
    for (let i = 1; i < intervals.length; i++) {
        if(intervals[i][0] <= results[results.length - 1][1]){
            let merged = results.pop();
            merged[1] = Math.max(merged[1], intervals[i][1]);
            results.push(merged);
        } else{
            results.push([...intervals[i]]);
        }
    }
    return results;
};

738.单调递增的数字 (需要回看)

给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。

(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)

示例 1:

  • 输入: N = 10
  • 输出: 9

示例 2:

  • 输入: N = 1234
  • 输出: 1234

示例 3:

  • 输入: N = 332
  • 输出: 299

说明: N 是在 0, 10\^9 范围内的一个整数。

官方题解:

题目要求小于等于N的最大单调递增的整数,那么拿一个两位的数字来举例。

例如:98,一旦出现strNumi - 1 > strNumi的情况(非单调递增),首先想让strNumi - 1--,然后strNumi给为9,这样这个整数就是89,即小于98的最大的单调递增整数。

这一点如果想清楚了,这道题就好办了。

此时是从前向后遍历还是从后向前遍历呢?

从前向后遍历的话,遇到strNumi - 1 > strNumi的情况,让strNumi - 1减一,但此时如果strNumi - 1减一了,可能又小于strNumi - 2

这么说有点抽象,举个例子,数字:332,从前向后遍历的话,那么就把变成了329,此时2又小于了第一位的3了,真正的结果应该是299。

那么从后向前遍历,就可以重复利用上次比较得出的结果了,从后向前遍历332的数值变化为:332 -> 329 -> 299

确定了遍历顺序之后,那么此时局部最优就可以推出全局,找不出反例,试试贪心。

TypeScript 复制代码
function monotoneIncreasingDigits(n: number): number {
    let strArr: number[] = String(n).split('').map(i => parseInt(i));
    const length = strArr.length;
    let flag: number = length;
    for (let i = length - 2; i >= 0; i--) {
        if (strArr[i] > strArr[i + 1]) {
            strArr[i] -= 1;
            flag = i + 1;
        }
    }
    for (let i = flag; i < length; i++) {
        strArr[i] = 9;
    }
    return parseInt(strArr.join(''));
};
相关推荐
Turbo正则14 分钟前
群论在AI中的应用概述
人工智能·算法·抽象代数
ysa05103018 分钟前
【并查集】判环
c++·笔记·算法
Jerry35 分钟前
KeetCode 44. 开发商购买土地
算法
Jerry1 小时前
KeetCode 58. 区间和
算法
Jerry2 小时前
LeetCode 209. 长度最小的子数组
算法
彦为君2 小时前
算法思维与经典智力题
java·前端·redis·算法
智能优化与强化学习2 小时前
Gym(Gymnasium)仿真环境详解(二):环境简介、入门算法、调参要点、核心挑战
算法·强化学习·gym·零基础入门·算法评估
mxwin3 小时前
Unity Shader exp 函数的算法与渲染应用
算法·unity·游戏引擎·shader
“码”力全开3 小时前
AI视频分析误报优化完整流程
算法·架构·边缘计算
深盾科技_Virbox3 小时前
深盾科技·Virbox产品体系全景解读:软件安全如何从加密锁走向全生命周期
java·大数据·算法·安全·软件需求