704 二分查找
第一遍没有AC 问题在于区间的混淆
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
left = 0
right = len(nums) - 1
while (left < right): #应该写成左闭右闭 <=
mid = (left + right) / 2 #区分python的整数除法和小数除法 这里应该用//整数除法
if nums[mid] == target:
return mid
elif nums[mid] > target:
right = mid - 1
elif nums[mid] < target:
left = mid + 1
return -1
不同区间left和right的取值就不同
闭区间:left 和 right都可以取到 所以是 0 和len(nums) -1; left <= right
开区间:left 和 right都取不到 所以是 -1 len(nums) ; left + 1 < right
27. 移除元素
class Solution(object):
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
# 数组为空的情况
if len(nums) == 0:
return 0
# 数组大于等于两个值的情况
length = len(nums)
left = 0
right = 0
n = 0
while(right < length):
if nums[right] != val:
nums[left] = nums[right]
left = left + 1
right = right + 1
else:
right = right + 1
n = n + 1
return length - n
双指针的思想,一次循环就可以搞定,要把握住循环中的不变量思想
第一次写的时候让每次找到val之后就length - 1 这样不对,会遗漏后面还没有遍历到的元素
想了想应该把找到的val的数量记录下来,然后返回的时候减掉就行。
另外需要注意区间问题,这里我考虑的是用数组实际的长度来表示。