Facebook面試題專題3 - leetcode238. Product of Array Except Self/56. Merge Intervals
阿新 • • 發佈:2018-12-19
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