Facebook面试题专题3 - leetcode238. Product of Array Except Self/56. Merge Intervals

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a786150017/article/details/84872689

238. Product of Array Except Self

题目描述

给定一个n个元素的数组nums(n > 1),返回数组output。其中output[i] 等于除了元素nums[i]的其余元素的乘积。

要求:不要分治,时间复杂度O(n)。最好常数空间 ~

例子

Input: [1,2,3,4]
Output: [24,12,8,6]

思想剑指offer原题
Trick - 作图,分为上下两部分求解。
只扫描数组两次,故时间复杂度为O(n)。

解法

class Solution(object):
    def productExceptSelf(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        n = len(nums)
        res = [1] * n
        lower = 1
        for i in range(n):
            res[i] *= lower
            lower *= nums[i]
        
        upper = 1
        for i in range(len(nums)-1, -1, -1):
            res[i] *= upper
            upper *= nums[i]
        return res

56. Merge Intervals

题目描述

给定一系列区间,合并重叠区间。

例子
Example 1:

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

Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].

Example 2:

Input: [[1,4],[4,5]]
Output: [[1,5]]

Explanation: Intervals [1,4] and [4,5] are considered overlapping.

思想
1)判断是否重叠时,最好已将区间排序
2)如果interval1 和 interval2重叠,则合并为[min(interval1[0], interval2[0]), max(interval1[1], interval2[1])]

解法

# Definition for an interval.
# class Interval(object):
#     def __init__(self, s=0, e=0):
#         self.start = s
#         self.end = e

class Solution(object):
    def merge(self, intervals):
        """
        :type intervals: List[Interval]
        :rtype: List[Interval]
        """
        stack = []
        intervals.sort(key = lambda x:x.start)
        for interval in intervals:
            if stack and stack[-1].end >= interval.start:
                prev = stack.pop()
                stack.append(Interval(min(prev.start, interval.start), max(prev.end, interval.end)))
            else:
                stack.append(interval)
        return stack

优化

# Definition for an interval.
# class Interval(object):
#     def __init__(self, s=0, e=0):
#         self.start = s
#         self.end = e

class Solution(object):
    def merge(self, intervals):
        """
        :type intervals: List[Interval]
        :rtype: List[Interval]
        """
        res = []
        for interval in sorted(intervals, key = lambda x:x.start):    # 1) sort by start
            if res and res[-1].end >= interval.start:    # overlap
                res[-1].end = max(res[-1].end, interval.end)    # 2) compare end
            else:
                res.append(interval)
        return res

猜你喜欢

转载自blog.csdn.net/a786150017/article/details/84872689
今日推荐