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