1. 程式人生 > >Facebook面試題專題3 - leetcode238. Product of Array Except Self/56. Merge Intervals

Facebook面試題專題3 - leetcode238. Product of Array Except Self/56. Merge Intervals

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