首页 > 其他分享 >704. Binary Search

704. Binary Search

时间:2024-06-08 17:58:36浏览次数:18  
标签:Binary Search right target nums 704 middle int left

Given an array of integers nums which is sorted in ascending order, and an integer target, write a function to search target in nums. If target exists, then return its index. Otherwise, return -1.

You must write an algorithm with O(log n) runtime complexity.

Example 1:

Input: nums = [-1,0,3,5,9,12], target = 9
Output: 4
Explanation: 9 exists in nums and its index is 4

Example 2:

Input: nums = [-1,0,3,5,9,12], target = 2
Output: -1
Explanation: 2 does not exist in nums so return -1

Constraints:

  • 1 <= nums.length <= 104
  • -104 < nums[i], target < 104
  • All the integers in nums are unique.
  • nums is sorted in ascending order.

1.左闭右开写法:

注意事项:区间内定义是否合法,主要表现为以下三个地方:

                (1)int right=nums.size();

                        因为右边的是开,所以right的值应该比最大的下标+1

                (2)while(left<right)

                        当left=right的时候,区间是不合法的,所以left!=right

                (3)if(nums[middle]>target){
                                right=middle;
                            }

                        在这里,right=middle, 因为右边的是开,right的值是取不到的,所以可以等于middle。

还有一点就是后面else if的判断句,left=middle+1,如果写成left=middle的话,会超出时间限制。

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left=0;
        int right=nums.size();
        while(left<right){
            int middle=(left+right)/2;
            if(nums[middle]>target){
                right=middle;
            }
            else if(nums[middle]<target){
                left=middle+1;
            }
            else{
                return middle;
            }
        }
        return -1;
    }
};

2.左闭右闭写法:

注意事项:依旧是区间的合法性,具体体现为以下四点:

                (1)int right=nums.size()-1;

                        因为右边的是闭,所以right的值应该=最大的下标

                (2)while(left<=right)

                        当left=right的时候,区间是合法的,所以left可以=right,不要漏了这个条件

                (3)if(nums[middle]>target){
                                right=middle-1;
                            }

                        在这里,right=middle-1, 因为右边的是闭,right的值是取得到的,在if条件判断中已经判断了middle下标的值>target,如果不是middle-1的话,在边界条件上就会出问题了,因为右边是闭。

                (4)else if(nums[middle]<target){
                              left=middle+1;
                            }

                        left=middle+1,理由同(3)

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left=0;
        int right=nums.size()-1;
        while(left<=right){
            int middle=(left+right)/2;
            if(nums[middle]>target){
                right=middle-1;
            }
            else if(nums[middle]<target){
                left=middle+1;
            }
            else{
                return middle;
            }
        }
        return -1;
    }
};

总之,两种写法都可以,最重要的是看区间的边界是否合法。

标签:Binary,Search,right,target,nums,704,middle,int,left
From: https://blog.csdn.net/2301_80161204/article/details/139549179

相关文章

  • 讲清楚 Elasticsearch scroll 的底层原理
    Elasticsearch的Scroll主要用于高效地分批检索大量数据记录,适用于那些数据量过大而不能一次性通过标准搜索请求获取所有结果的场景。Scroll机制的工作原理类似于数据库中的游标(cursor),它允许用户发起一次搜索请求后,通过维护一个持续的上下文(context)来分批次获取所有匹配的文档,......
  • RainBond 制作应用并上架【以ElasticSearch为例】
    文章目录安装ElasticSearch集群第1步:添加组件第2步:查看组件第3步:访问组件制作ElasticSearch组件准备工作ElasticSearch集群原理尝试Helm安装ES集群RainBond制作ES思路源代码Dockerfiledocker-entrypoint.shelasticsearch.yml......
  • Meta最新路径搜索算法 Beyond A*: Better Planning with Transformers via Search Dyn
    这篇论文前两个月刚刚放出,研究了如何让人工智能(AI)更好地解决复杂的规划问题,比如在迷宫中寻找最短路径,或者推箱子游戏(Sokoban)中把箱子全部推到指定位置。传统上,这类问题通常使用专门的规划算法来解决,比如A*搜索算法。但是,训练AI模型(如Transformer)来解决这些问题......
  • 代码随想录算法训练营第一天 | 704. 二分查找 27. 移除元素
    704.二分查找题目:给定一个n个元素有序的(升序)整型数组和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。提示:1.你可以假设nums中的所有元素是不重复的。2.n将在[1,10000]之间。3.nums的每个元素都将在[-9999,9999]之间。解题:思路:二......
  • elastic search服务搭建
    安装java升级gcsudoyuminstallcentos-release-sclsudoyuminstalldevtoolset-8-gcc*sclenabledevtoolset-8bashgcc-v切换gc到新版mv/usr/bin/gcc/usr/bin/gcc-4.8.5ln-s/opt/rh/devtoolset-8/root/bin/gcc/usr/bin/gccmv/usr/bin/g++/usr/bin/g++-4.8......
  • Elasticsearch强制重置未分配的分片(unassigned)
    强制重置未分片的分片,这个问题源自于Elasticsearch维护中,Node意外退出的场景。意外退出后Elasticsearch由于网络原因或者jvm性能压力,未能短时间内分配分片。看一下分片的状态。可以看到有一些分片处于未分配状态。代码语言:javascript复制curlhttp://10.93.21.2......
  • Binary Ninja 4.0.5336 (macOS, Linux, Windows) - 逆向平台
    BinaryNinja4.0.5336(macOS,Linux,Windows)-逆向平台请访问原文链接:https://sysin.org/blog/binary-ninja/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgBinaryNinjaANewTypeofReversingPlatformBinaryNinja是一个交互式反编译器、反汇编器、调试......
  • 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素(数组)
    第一次打卡,记录还不够充分,会慢慢丰富起来一、二分查找题目链接:704.二分查找-力扣(LeetCode)讲解链接:Carl讲解视频讲解:代码随想录讲解 情况1:左闭右闭区间情况2:左闭右开区间 二、移除元素题目链接:27.移除元素-力扣(LeetCode)讲解链接:Carl讲解视频讲解:代码随想......
  • 分布式搜索引擎ElasticSearch学习笔记
    一、Elasticsearch介绍什么是elasticsearch?一个开源的分布式搜索引擎,可以用来实现搜索、日志统计、分析、系统监控等功能什么是elasticstack(ELK)?是以elasticsearch为核心的技术栈,包括beats、Logstash、kibana、elasticsearch什么是Lucene?是Apache的开源搜索引擎类库,提......
  • 代码随想录算法训练营第一天 | 704. 二分查找,27. 移除元素
    题目链接:704.二分查找思路:该题为有序数组查找,采用二分法。根据区间分为左闭右闭和左闭右开两种情况坑:左右区间的开闭补充:vector容器时间复杂度:O(logn)空间复杂度:O(1)题目链接:27.移除元素思路:题目说返回k个元素之后留下什么不重要,也不考虑数组剩下元素的......