704. 二分查找
力扣题目链接
文章讲解链接
视频讲解链接
题目概述:
给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
示例 1:
输入:nums
= [-1,0,3,5,9,12],target
= 9 输出: 4 解释: 9 出现在nums
中并且下标为 4
示例 2:
输入:nums
= [-1,0,3,5,9,12],target
= 2 输出: -1 解释: 2 不存在nums
中因此返回 -1
提示:
- 你可以假设
nums
中的所有元素是不重复的。 n
将在[1, 10000]
之间。nums
的每个元素都将在[-9999, 9999]
之间。
思路:
本题根据题意,提供数组为(生序)有序数组,提示中告诉我们元素不重复,满足二分法使用的前提条件。
二分法使用技巧&方法&注意事项:
二分法使用时要注意区间的定义,常用的有两种,左闭右闭[left, right],或者[left, right)
Python写法一:
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) - 1 #定义target 在左闭右闭区间,【left, right】
while left <= right:
middle = left + (right - left) // 2 #注意这里要用 // 整除
if nums[middle] > target:
right = middle - 1 #target在左区间,所以【left, middle - 1】
elif nums[middle] < target:
left = middle + 1 #target在右区间,所以【middle + 1,right】
else:
return middle #数组中找到目标值,直接返回下标
return -1 #未找到目标值
Python写法二:
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) #定义target 在左闭右闭区间,【left, right】
while left < right:
middle = left + (right - left) // 2 #注意这里要用 // 整除
if nums[middle] > target:
right = middle #target在左区间,所以【left, middle - 1】
elif nums[middle] < target:
left = middle + 1 #target在右区间,所以【middle + 1,right】
else:
return middle #数组中找到目标值,直接返回下标
return -1
相关题目:
27.移除元素
力扣题目链接
文章讲解链接
视频讲解链接
题目概述:
给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1)
额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
注意点:
数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖
暴力解法
这个题目暴力的解法就是两层for循环,一个for循环遍历数组元素 ,第二个for循环更新数组。
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
i, l = 0, len(nums)
while i < l:
if nums[i] == val: # 找到等于目标值的节点
for j in range(i+1, l): # 移除该元素,并将后面元素向前平移
nums[j - 1] = nums[j]
l -= 1
i -= 1
i += 1
return l
双指针法
双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
定义快慢指针
- 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
- 慢指针:指向更新 新数组下标的位置
快慢指针法
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
# 快慢指针
fast = 0 # 快指针
slow = 0 # 慢指针
size = len(nums)
while fast < size: # 不加等于是因为,a = size 时,nums[a] 会越界
# slow 用来收集不等于 val 的值,如果 fast 对应值不等于 val,则把它与 slow 替换
if nums[fast] != val:
nums[slow] = nums[fast]
slow += 1
fast += 1
return slow
相关题目: