704二分查找
二分查找的前提条件:数组为有序数组,同时题目还强调数组中无重复元素,结果唯一
**难点:**区间划分
思路:重点是保证这个要查找的区间是个合法区间,考虑特殊情况比如1,1,[1,1)(不合法)
- 【a,b】左闭右闭区间:left ≤ right; middle = (l+r)/2; 更新:right = middle -1, left = middle+1
- 【a,b)左闭右开区间:left < right; middle = (l+r)/2; 更新:right = middle, left = middle +1
class Solution:
def search(self, nums:list[int], target: int) -> int:
l = 0
r = len(nums)-1
result = -1
while l < r:
mid = int((l+r+1)/2)
# print(l, r, mid)
if nums[mid] > target:
r = mid -1
else:
l = mid
if target == nums[l]:
result = l
return result
array = [-1,0,3,5,9,12]
result = Solution().search(array, 9)
print(result)
27移除元素
题目:给你一个数组 nums
**和一个值 val
,你需要 原地 移除所有数值等于 val
**的元素,并返回移除后数组的新长度。
输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
在物理空间上是一个覆盖的操作,是一个O(n)的时间复杂度,而不是O(1)
思路:双指针思路O(n) and 暴力(不推荐)
快指针所指向的是新数组里需要的元素,只有在不等于目标值的时候快指针才有意义。慢指针是在等于目标值的时候有意义
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
# 双指针
fast = 0
slow = 0
size = len(nums)
while fast < size:
if nums[fast] != val:
nums[slow] = nums[fast]
fast +=1
slow +=1
else:
fast +=1
return slow