LeetCode算法—二分查找
一:二分查找法
1、二分法核心语句
nums=[]
left,right=0,len(nums)-1
while left<=right:#根据具体题目判断是否有相等的情况
mid=(left+right)//2
if num[mid]<target:
left=mid+1
elif nums[mid]>target:
right=mid-1
else:
return mid
二:LeetCode
35搜索插入的位置
(1)思路:定义三个指针left,right,mid;进入while:当left和right指针交换位置说明数组遍历完了;当mid索引对应的元素小于目标值;left=mid+1;反之right=mid-1;为什么这样自己好好看看数据结构
class Solution:
def searchInsert(self, nums, target: int) -> int:
left,right=0,len(nums)-1
while left<=right:
mid=(left+right)//2
if nums[mid]==target:
return mid
elif nums[mid]<target:
left=mid+1
elif nums[mid]>target:
right=mid-1
return left
74 搜索二维矩阵
(1)思路1:将二维列表转化为1为列表;然后直接判断目标值是否在列表当中;如果在返回True,反之false
(2)思路2:将二维列表中所有元素放到新的一维列表当中;然后使用二分法进行查找(此处不考虑排序问题)
#方法1 暴力解法
class Solution:
def searchMatrix(self, matrix, target: int) -> bool:
list=[]
for i in matrix:
if target in i:
return True
return False
#方法2 二分查找
class Solution:
def searchMatrix(self, matrix, target: int) -> bool:
list=[]
for i in matrix:
for j in i:
list.append(j)
left,right=0,len(list)-1
while left<=right:
mid=(left+right)//2
if list[mid]<target:
left=mid+1
elif list[mid]>target:
right=mid-1
else:
return True
return False
162 寻找峰值
(1)思路1:简单的二分查找;关键要读懂题目:考验你数学的功底的时候了
(2)思路2:暴力解法通杀一切;只要不超时!
#方法1 二分查找
class Solution:
def findPeakElement(self, nums) -> int:
left, right = 0, len(nums) - 1
while left < right:
mid = (left + right) // 2
if nums[mid] > nums[mid + 1]:
# 峰值在左侧,包括mid
right = mid
else:
# 峰值在右侧,不包括mid
left = mid + 1
return left
#方法2 暴力解法
def func(nums):
for i in range(1,len(nums-1)):
if nums[i]<nums[i-1] and nums[i]>nums[i+1]:
return i
#判断数组两边的元素
if nums[0]>nums[i]:
return 0
if nums[-1]>nums[-2]:
return len(nums)-1
704 二分查找
class Solution:
def search(self, nums, target: int) -> int:
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) // 2
# 计算mid的过程必须放到while循环里面;当两个指针交换位置的时候说明数组所有元素查找完毕;结束循环
if nums[mid] == target:
return mid
elif nums[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1 # 如果未找到目标值,返回 -1
作者:
Shu-How Z
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。