11. 盛最多水的容器
題目 :
給定 n 個非負整數 a1,a2,...,an,每個數代表座標中的一個點 (i, ai) 。畫 n 條垂直線,使得垂直線 i 的兩個端點分別爲 (i, ai) 和 (i, 0)。找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。
注意:你不能傾斜容器,n 至少是2。
分析:
從兩端的兩直線開始向中間逼近最大容量。假設最左端 i,最右端的爲 j:
情況一:height[i] < height[j], i++;
首先我們要知道容量由短的一邊決定。若j左邊的高度小於height[j],明顯容量變小;若 j 左邊的高度大於height[j],底邊變短,高度不變(還是height[i]),容量還是變小。即這種情況下不管 j 左邊的高度是大於還是小於height[j]都不應左移 j。而應該考慮 i 右移的情況。
情況二:height[i] >= height[j],j --;
跟情況一同理。
代碼:
class Solution(object):
def maxArea(self, height):
"""
:type height: List[int]
:rtype: int
"""
l = len(height)
i = 0
j = l - 1
max_area = (j - i) * min(height[i], height[j])
while i != j:
if height[i] > height[j]:
j = j - 1
else:
i = i + 1
temp = (j - i) * min(height[i], height[j])
max_area = max(max_area, temp)
return max_area
26. 刪除排序數組中的重複項
題目:
給定一個排序數組,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後數組的新長度。
不要使用額外的數組空間,你必須在原地修改輸入數組並在使用 O(1) 額外空間的條件下完成。
示例 1:
給定數組 nums = [1,1,2], 函數應該返回新的長度 2, 並且原數組 nums 的前兩個元素被修改爲 1, 2。 你不需要考慮數組中超出新長度後面的元素。
示例 2:
給定 nums = [0,0,1,1,1,2,2,3,3,4], 函數應該返回新的長度 5, 並且原數組 nums 的前五個元素被修改爲 0, 1, 2, 3, 4。 你不需要考慮數組中超出新長度後面的元素。
分析:
新建一個空數組temp,遍歷nums,如果是temp中沒有的數就插入temp中,最後將temp的數一一賦給nums,返回temp的長度
代碼:
class Solution(object):
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
temp = []
for n in nums:
if n not in temp:
temp.append(n)
l = len(temp)
for i in range(0, l):
nums[i] = temp[i]
return l
33. 搜索旋轉排序數組
題目:
假設按照升序排序的數組在預先未知的某個點上進行了旋轉。
( 例如,數組 [0,1,2,4,5,6,7]
可能變爲 [4,5,6,7,0,1,2]
)。
搜索一個給定的目標值,如果數組中存在這個目標值,則返回它的索引,否則返回 -1
。
你可以假設數組中不存在重複的元素。
你的算法時間複雜度必須是 O(log n) 級別。
示例 1:
輸入: nums = [4,5,6,7,0,1,2], target = 0 輸出: 4
示例 2:
輸入: nums = [4,5,6,7,0,1,2], target = 3 輸出: -1
分析:
將數組看成兩個升序隊列,且第二個隊列的最大值小於第一個隊列的最小值
按照二分法查找,按照nums[mid]是在第一個隊列還是第二個隊列分成兩種情況進行討論。
代碼:
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
begin = 0
end = len(nums) - 1
while begin <= end:
mid = int((begin + end) / 2)
if nums[mid] == target:
return mid
elif nums[mid] >= nums[begin]:
if target >= nums[begin] and target < nums[mid]:
end = mid - 1
else:
begin = mid + 1
else:
if target <= nums[end] and target > nums[mid]:
begin = mid + 1
else:
end = mid - 1
return -1