Google面試題專題3 - leetcode33. Search in Rotated Sorted Array/11. Container With Most Water - 經典
leetcode33. Search in Rotated Sorted Array
面試常考題!(微軟、頭條和百度)
題目描述
假設一升序陣列以某基準數進行旋轉。例如[0,1,2,4,5,6,7] → [4,5,6,7,0,1,2]
查詢目標數字。如果在陣列中出現返回它的索引,否則返回-1.
假設陣列中沒有重複數字,時間複雜度要求O(logn).
例子
Example 1:
Input: nums = [4,5,6,7,0,1,2], target = 0
Output: 4
Example 2:
Input: nums = [4,5,6,7,0,1,2], target = 3
Output: -1
思想
考慮二分查詢。
(法1)
1)首先判斷mid的位置(在基準線左側還是右側)。
若mid在左側,判斷target和nums[mid]的大小關係。
1.1)若target>mid,則left = mid + 1
1.2)否則,需判斷target的位置(在基準線左側還是右側)。若target在基準線左側(target>nums[right]),則right = mid - 1;否則,left = mid + 1.
2)若mid在右側,同理進行判斷。
特殊情況 - 全升序。因為求mid時四捨五入會偏向於left,所以比較時和nums[right]進行比較。
(法2)
先找出基準數,然後對左右兩段分別進行二分。
解法
複雜度:時間O(logn),空間O(1)
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
left, right = 0, len(nums)-1
while left <= right:
mid = (left + right) >> 1
if target == nums[mid]:
return mid
# 1) mid在基準線左側
if nums[mid] > nums[right]:
if nums[right] < target < nums[mid]:
right = mid - 1
else:
left = mid + 1
# 2) mid在基準線右側
else:
if nums[mid] < target <= nums[right]:
left = mid + 1
else:
right = mid - 1
return -1
leetcode11. Container With Most Water
題目描述
給定n個非負整數a1, a2, …, an,每個整數代表座標點(i, ai). 在座標軸畫n條豎線表示高度。
找到兩條豎線,和x軸圍成一個容器,使得容器可以裝下最多的水。
不允許傾斜容器,且n至少為2.
例子
Input: [1,8,6,2,5,4,8,3,7]
Output: 49
思想
起始和終止兩條豎線,肯定取高度更低的一方為容器的高。
暴力解法:時間複雜度為O(n^2),遍歷起始線,遍歷終止線,計算可能的面積,取最大值。
改進:因為有起始線和終止線兩條線,所以考慮雙指標。初始時指向頭和尾,移動更低的指標,並記錄面積。
解法
複雜度:時間O(n),空間O(1)
class Solution(object):
def maxArea(self, height):
"""
:type height: List[int]
:rtype: int
"""
area = 0
l = 0
r = len(height) - 1
while l < r:
area = max(min(height[l], height[r]) * (r - l) , area)
if height[l] < height[r]:
l += 1
else:
r -= 1
return area