刷题1-704. 二分查找、27. 移除元素
704根据 左闭右开,左闭右闭 两种区间规则 写出来的二分法;27暴力破解和双指针
1.二分查找题目
题目链接
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
左闭右开
简单来说就是,len()求出长度不-1,使得 r 出界。l==r也无意义
# 左闭右开
class Solution:
def search(self, nums: List[int], target: int) -> int:
l=0
r=len(nums)
while(l<r): #等于无意义,涉及r
mid=int((l+r)/2)
if(target<nums[mid]):
r=mid #涉及r,右开不会被搜索到,不-1
elif target>nums[mid]:
l=mid+1
else:
return mid
return -1
左闭右闭
len()-1为r,r在数组内,l==r有意义。
#左闭右闭
class Solution:
def search(self, nums: List[int], target: int) -> int:
l=0
r=len(nums)-1
while(l<=r): #涉及r
mid=int((l+r)/2)
if target<nums[mid]:
r=mid-1 #涉及r
elif target>nums[mid]:
l=mid+1
else:
return mid
return -1
总结
二分查找两种方法,右开不开和r有关。
2.移除元素题目
移除元素链接
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素。
示例 2: 给定 nums = [0,1,2,2,3,0,4,2], val = 2, 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。
你不需要考虑数组中超出新长度后面的元素。
暴力破解
- 数组元素不能删除,只能覆盖
- Python 中没有 ++ 和 - -
#暴力破解
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
i=0
lenth=len(nums)
while i<lenth:
if nums[i]==val:
for j in range(i,lenth-1):
nums[j]=nums[j+1] #覆盖
lenth-=1 #覆盖之后长度-1
i-=1 #退一格再加一,重新判断该元素是否要被覆盖
i += 1
return lenth
双指针法(快慢指针法)
快指针:走得快,去找新元素
慢指针:走得慢,留在原地接应快指针
代码如下:
#快慢指针法
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
fast=0
slow=0
lenth=len(nums)
for fast in range(lenth):
if nums[fast]!=val: #fast寻找新元素
nums[slow]=nums[fast] #slow接应fast
slow+=1
return slow
总结
通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。