**###LC704**
class Solution:
def search(self, nums: List[int], target: int) -> int:
left = 0
right = len(nums)-1
while left <= right:
mid = (left+right)//2
if target > nums[mid]:
left = mid + 1
elif target < nums[mid]:
right = mid -1
else:
return mid
return -1
需要注意区间问题,左闭右开与左闭右闭需要在while参属下搭配不同的不等式,个人建议用左闭右闭来实现,便于记忆与理解。
**### LC35**
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
if len(nums)==0:
return 0
left = 0
right = len(nums)-1
while left <= right:
mid = (left+right)//2
if target ==nums[mid]:
return mid
if target > nums[mid]:
left = mid + 1
if target < nums[mid]:
right = mid -1
return right + 1
原二分查找引申,对于插入位置而言,更大的问题是去寻找最终查找的落脚点。同时还有以下分组讨论方法,需要注意越界问题。
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
left = 0
right = len(nums)-1
while left <= right:
mid = (left+right)//2
if target < nums[mid]:
if mid-1>=0:
if target > nums[mid-1]:
return mid
else:
return 0
right = mid -1
elif target > nums[mid]:
if mid +1 <=len(nums)-1:
if target < nums[mid+1]:
return mid +1
else:
return len(nums)
left = mid +1
else:
return mid
return -1
###LC27
## 暴力法,寻找指定的数字然后数组后方数字前推。
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
i = 0
l = len(nums)
while i < l:
if nums[i] == val:
for j in range(i+1,l):
nums[j-1] = nums[j]
l = l-1
i = i-1
i = i+1
return l
### 快慢指针法
class Solution(object):
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
slow = 0
for fast in range(len(nums)):
if nums[fast] != val:
nums[slow] = nums[fast]
slow +=1
return slow
#slow指针用于收集不等于val的值,fast指针会在前面寻找不等于val的值回填给slow指针所指。一般情况下,慢指针有时会比快指针先行一步。