704. 二分查找
题目链接:704、二分查找
方法一:暴力搜索
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
l = len(nums)
for i in range(l):
if nums[i] == target:
return i
return -1
nums = [-1, 0, 3, 5, 9, 12]
target = 2
solution = Solution()
print(solution.search(nums, target))
方法二:二分搜索
左闭右闭:
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
l = len(nums)
left = 0
right = l - 1
while left <= right:
mid = left + (right - left) // 2
if target > nums[mid]:
left = mid + 1
elif target < nums[mid]:
right = mid - 1
else:
return mid
return -1
nums = [-1, 0, 3, 5, 9, 12]
target = 2
solution = Solution()
print(solution.search(nums, target))
我的一个易错点是:
if target > nums[mid]:
left = mid + 1
elif target < nums[mid]:
right = mid - 1
else:
return mid
我经常把nums[mid]写成mid去跟target比较,而且自己看不出来。。。
左闭右开:
class Solution(object):
def search(self, nums, target):
l = len(nums)
left = 0
right = l
while left < right:
mid = left + (right - left) // 2
if target > nums[mid]:
left = mid + 1
elif target < nums[mid]:
right = mid
else:
return mid
return -1
nums = [-1, 0, 3, 5, 9, 12]
target = 2
solution = Solution()
print(solution.search(nums, target))
27、移除元素
题目链接:27、移除元素
方法一:暴力解法
class Solution(object):
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
i = 0
l = len(nums)
while i < l:
if nums[i] == val:
for idx in range(i, l - 1):
nums[idx] = nums[idx + 1]
l -= 1
else:
i += 1
return l
nums = [-1, 2, 2, 5, 9, 12]
target = 2
solution = Solution()
print(solution.removeElement(nums, target))
注意:
1.题目中明确说明“不要使用额外的数组空间”,因此只能用for循环覆盖原数组
2.运行时间限制:如果while i<len(nums),每次循环都会算一遍len(),运行时间会增加。
方法二:双指针法
class Solution(object):
def removeElement(self, nums, val):
slow = 0
l = len(nums)
for fast in range(l):
if val != nums[fast]:
nums[slow] = nums[fast]
slow += 1
return slow
nums = [-1, 2, 2, 5, 9, 12]
target = 2
solution = Solution()
print(solution.removeElement(nums, target))
注意:
1.fast是寻找新数组的数值,相当于探路者,因此应该先判断nums[fast]是不是val
2.返回时直接返回slow就可以了,因为slow已经被加一了