1. 程式人生 > >Google面試題專題3 - leetcode33. Search in Rotated Sorted Array/11. Container With Most Water - 經典

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.

例子
leetcode11

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