88. Merge Sorted Array
微软实习面试题
题目描述
给定两个有序整数数组nums1和nums2,合并两者成一个有序数组。
nums1和nums2的元素数目分别是m和n。假设nums1有足够空间(≥m+n)来容纳来自于nums2的元素。
例子
Input:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
Output: [1,2,2,3,5,6]
思想
要求是原地修正。
(法1) - Trick
从后向前比较,较大的元素从nums1尾部开始放。
(法2)
从前向后比较,较小的元素从nums1尾部开始放,然后逆序nums。
解法
```python
class Solution(object):
def merge(self, nums1, m, nums2, n):
"""
:type nums1: List[int]
:type m: int
:type nums2: List[int]
:type n: int
:rtype: void Do not return anything, modify nums1 in-place instead.
"""
while m and n:
if nums1[m-1] > nums2[n-1]:
nums1[m+n-1] = nums1[m-1]
m -= 1
else:
nums1[m+n-1] = nums2[n-1]
n -= 1
if n:
nums1[:n] = nums2[:n]
278. First Bad Version
题目描述
你是PM且现在领导团队开发一个新产品。不幸的是,最新版的产品有质量问题。因为每个版本都是基于上个版本产品开发的,所以质量差的产品会延续给下一代产品。
假设你有n代产品[1, 2, …, n],想找到第一个坏的版本。
给定一个API名为 isBadVersion(version),返回version是否是坏的。编写函数找到第一个坏的版本。(最小化调用API的次数)
例子
Given n = 5, and version = 4 is the first bad version.
call isBadVersion(3) -> false
call isBadVersion(5) -> true
call isBadVersion(4) -> true
Then 4 is the first bad version.
思想
二分,找到第一个为 isBadVersion(version)返回为true的版本。
解法
# The isBadVersion API is already defined for you.
# @param version, an integer
# @return a bool
# def isBadVersion(version):
class Solution(object):
def firstBadVersion(self, n):
"""
:type n: int
:rtype: int
"""
l, r = 1, n
while l <= r:
mid = (l + r) >> 1
if isBadVersion(mid):
if mid == 1 or not isBadVersion(mid-1):
return mid
r = mid - 1
else:
l = mid + 1