思路:
二分查找法
前提是数组为有序数组,且数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的。
写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。
代码:
第一种,左闭右闭即[left, right]
class Solution:
def search(self, nums: List[int], target: int) -> int:
left=0
right=len(nums)-1
while left<=right:
middle=left+(right-left)//2 # 防止溢出,等同于(left+right)//2
if nums[middle]>target:
right=middle-1
elif nums[middle]<target:
left=middle+1
else:
return middle
return -1
- 时间复杂度:O(log n)
- 空间复杂度:O(1)
第二种,左闭右开即[left, right)
class Solution:
def search(self, nums: List[int], target: int) -> int:
left=0
right=len(nums)
while left<right:
middle=left+(right-left)//2
if nums[middle]>target:
right=middle
elif nums[middle]<target:
left=middle+1
else:
return middle
return -1
- 时间复杂度:O(log n)
- 空间复杂度:O(1)
思路:
数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖
代码:
暴力解法:两层for循环,一个for循环遍历数组元素 ,第二个for循环更新数组
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
- 时间复杂度:O(n^2)
- 空间复杂度:O(1)
双指针法:通过一个快指针和慢指针在一个for循环下完成两个for循环的工作
快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
慢指针:指向更新新数组下标的位置
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
slow=0
fast=0
size=len(nums)
while fast<size:
if nums[fast]!=val:
nums[slow]=nums[fast]
slow=slow+1
fast=fast+1
return slow
- 时间复杂度:O(n)
- 空间复杂度:O(1)
第一次打卡留念~