Top 100 Linked Question 修炼------第56题、第62题

区间合并与路径计数
本文介绍两种经典算法问题:合并重叠区间和计算唯一路径数量。通过具体实例解析算法思路,提供Python实现代码。

56. Merge Intervals

题目链接

题目解释:给定间隔的集合,合并所有重叠的间隔。这个题目直接看题意个人感觉还是比较难以理解的,我们可以直接分析题目给出的例子,然后结合题意理解:

Input: [[1,3],[2,6],[8,10],[15,18]]
Output: [[1,6],[8,10],[15,18]]

首先给出的输入是上面那一行,输出是下面这一行,那么是怎么得到的呢?与题目要求的合并重叠的间隔可知:[1,3]与[2,6]这两个集合存在重叠(更为直观的方式是将里面所有的元素全都画到一个数轴上,直接就可以分析出重叠的部分),那么按照题目的意思,应该合并这两个内容,于是就得到了[1,6]这个区间,同样的,继续分析后面,发现不相交,那么就可以得到最后的结果了。

题目分析:首先是按照最常规的分析方式,可以想到直接就是先合并两个,然后再将其与后面的区间合并,最后得到统一的区间。那么按照这个思路来分析的话,那么最终就是需要比较第一个区间的尾部和第二个区间的头部的比较即可。但是,题目并没有给出这个条件说我们的大区间里面的元素是有序的,那么首先,需要进行的工作就是将所有的list中内容按照第一个元素进行排序。所以,按照这样的思路,很容易写出下列代码:

class Solution:
    def merge(self, intervals: List[Interval]) -> List[Interval]:
        intervals.sort(key=lambda x: x.start)
        merged = []
        for interval in intervals:
            # 没有存在重叠的部分,直接加入到最后的结果
            if not merged or merged[-1].end < interval.start:
                merged.append(interval)
            else:
                # 存在重叠的部分,那么直接修改前面的一个区间的最后一个元素即可
                merged[-1].end = max(merged[-1].end, interval.end)
        return merged

62. Unique Paths

题目链接

题目解释:看到上面这个可爱的robot了吧,它想要去摘一下右下角的那个星星。你想要去摘星星,满足你吧,但是也有一些要求哦,当你到达某个位置后,你只能选择往前或者往下走,试问,总共存在多找条这样的路径,使我们聪明的robot可以摘到小星星。

题目分析:希望看到这个题目的时候,你一下就有自己的想法,这个很明显的是使用DP去解决的问题,且很容易就给出状态转移方程,假设robot是在下图(1)这个位置,那么按照规则,只能存在两个方向才能到达,如下图的箭头所示:

那么到达(1)位置的方式总共就是到达两个箭头所指的位置的方式之和,于是,我们的DP解题方案就出来了:

def uniquePaths(self, m, n):
    if not m or not n:
        return 0
    dp = [[1 for _ in xrange(n)] for _ in xrange(m)]
    for i in xrange(1, m):
        for j in xrange(1, n):
            dp[i][j] = dp[i-1][j] + dp[i][j-1]
    return dp[-1][-1]

同样的,这个是需要开辟一个m*n的空间,一般情况下我们都可以将之优化,只是需要开辟一个n的空间即可,

    def uniquePaths(self, m: int, n: int) -> int:
        if not m or not n:
            return 0
        cur=[1]*n
        for i in range(1,m):
            for j in range(1,n):
                cur[j]+=cur[j-1]
        return cur[-1]

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值