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
posted @ 2024-09-11 17:08  Gsupl.落浅~  阅读(10)  评论(0编辑  收藏  举报