首页 > 其他分享 >数组-二分类

数组-二分类

时间:2022-08-16 15:26:25浏览次数:56  
标签:right target nums 分类 middle 数组 左闭 left

数组

二分法查找

前提

  1. 数组为有序数组;
  2. 数组中没有重复元素。

优点
逻辑简单

难点
涉及很多边界条件,对区间定义不清楚,二分法则容易写乱

解决方法:

原则: 循环不变量规则

二分查找中,保持区间不变量,在循环寻找中每一次边界的处理都要坚持区间的定义来操作,

方式:

  1. 左闭右闭

  2. 左闭右开

左闭右闭

第一种写法,我们定义 target 是在一个在左闭右闭的区间里,也就是[left, right] (这个很重要非常重要)。

区间的定义这就决定了二分法的代码应该如何写,因为定义target在[left, right]区间,所以有如下两点:

  • while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=
  • if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1
class Solution:
    def search(self, nums: List[int], target: int)->int:
        """
        左闭右闭
        """
        left, right = 0, len(nums) - 1
        while left <= right:
            middle = (left + right) // 2
            if nums[middle] < target:
                left = middle + 1
            elif nums[middle] > target:
                right = middle - 1
            else:
                return middle
        
        return -1

左闭右开

如果说定义 target 是在一个在左闭右开的区间里,也就是[left, right) ,那么二分法的边界处理方式则截然不同。

有如下两点:

  • while (left < right),这里使用 < ,因为left == right在区间[left, right)是没有意义的
  • if (nums[middle] > target) right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]
class Solution:
    
    def search(self, nums: List[int], target: int)->int:
        """
        左闭右开
        """
        if not nums:
            return -1
        l = 0
        r = len(nums) - 1
        while l <= r:
            m = round(l+(r-l)/2)
            if nums[m] == target:
                return m     
            elif nums[m] > target:
                r=m-1
            else:
                l=m+1
        return -1 
    

标签:right,target,nums,分类,middle,数组,左闭,left
From: https://www.cnblogs.com/01black-white/p/16591636.html

相关文章

  • 数组 各种方法的效率问题
    slice与filter的效率对比(无条件筛选)数据条数:5000条,slice效率1ms以内filter效率1.5ms以内25000条1ms-3ms1.7ms-3.5ms100000条5ms-11ms8ms-14ms 2.......
  • 【代码随想录刷题笔记】——数组(持续更新中)
    代码随想录——数组理论基础二分查找704.二分查找-力扣(LeetCode)代码/思路在一个有序数组中通过二分查找解决找到目标值的问题。C++版//版本一:左闭右闭的写法cl......
  • php:输出关联数组特定范围的数据
    php:输出关联数组特定范围的数据    一、php源码(将“关联数组”转化为“索引数组”,然后输出) 1<?php23//definedatastructure4class......
  • 子数组异或和(前缀和、哈希)
    题意给定一个长度为\(n\)的整数数组\(a_1,a_2,\dots,a_n\)。请你统计一共有多少个数组\(a\)的非空连续子数组能够同时满足以下所有条件:该连续子数组的长度为偶数。......
  • 哈希表2:两个数组的交集(349)
    本题如下:(链接:https://leetcode.cn/problems/intersection-of-two-arrays/submissions/)题目:给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一......
  • php:面向对象之成员变量(数组)
    php:面向对象之成员变量(数组)    一、PHP源码  1<?php23classDATA{4public$dlt_data="";56//setvalue......
  • Easy Fix (排序+树状数组+离线处理+找规律)
    题目:给定长度为n的排列p,令Ai表示i左边比pi小的数字个数,Bi表示i右边比pi小的数字个数,Ci=min(Ai,Bi)。有m次独立的询问,每次询问给定u和v,问如果交......
  • js中数组和对象的深拷贝
    数组和对象的深拷贝数组:1.res=queue.concat()2.res=queue.slice(0)3.遍历对象:1.JSON.parse(JSON.stringify(obj))2.{...obj}......
  • 包含两个对象的数组排序
    1vardata=[{name:19,age:28},{name:30,age:29}]2functioncreateComparisonFunction(propertyName){3returnfunction(object1,object2){4varv......
  • 力扣-88-合并两个有序数组
    本来觉得很简单,然后准备提交了发现要在数组1里面合并,没有额外空间然后就有了一个大胆的想法——我直接插进去然后sortclassSolution{public: voidmerge(vector<int>......