首页 > 其他分享 >代码随想录----做题篇

代码随想录----做题篇

时间:2023-11-01 21:36:20浏览次数:22  
标签:right return target nums 随想录 mid ---- 做题 left

ABOUT

只做题,想思路

二分法

思路:两端的平均数跟要找的值对比,小了就缩小左边区间,大了就缩小右边区间,然后再次求两端的平均数,小了就缩小左边区间,大了就缩小右边区间,最终到达循环结束

  1. 对比加缩小区间,写法很简单
if (nums[mid] > target){
                right = mid;
            }
            else if (nums[mid] < target){
                left = mid;
            }
            else if (target == nums[mid]){
                return mid;
            }
  1. 结束条件呢?
while(left <= right)
or 
while(left < right)
  1. 假设第一种结束条件
while(left <= right) {//一定会存在一种情况就是左右区间取了相同值,这个区间是左闭右闭的
if (nums[mid] > target){
                right = mid;
            }
            else if (nums[mid] < target){
                left = mid;
            }
            else if (target == nums[mid]){
                return mid;
            }
      mid = (left + right) / 2;
//考虑target在最右边,这个写法有问题
//考虑target在最左边,这个写法感觉没有什么问题,但是它循环了三次
}

当我们发现给left = mid; 改成left = mid + 1;最右边的情况解决了,但是最左边的情况还是循环三次;那我们给它right = mid;改成right = mid - 1;循环次数少了一次

why?
你只要画一下图,你就会发现其实mid所指向的那个数根本没有比的必要,所以left = mid + 1;可以,我刚刚说的target就算在最左边其实也可以比到,所以left可以加一

减一呢?是否是我上面说的减一是为了循环次数少了一次?NONONO,这个减一非常有必要的加上去,不然就会出现死循环,比如target是在0到1之间的数,left跟right最终只会等于1,而无法返回正确结果,虽然我们知道死循环就是无解,就应该返回-1。

所以代码的最终样子是这样的

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

        if (nums[left] > target)
            return -1;
        if (nums[right] < target)
            return -1;
        if (nums[left] == target)
            return left;
        if (nums[right] == target)
            return right;
        //这四句是为了提高效率
        while(left <= right){
            if (nums[mid] > target){
                right = mid - 1;
            }
            else if (nums[mid] < target){
                left = mid + 1;
            }
            else if (target == nums[mid]){
                return mid;
            }
            mid = (left + right) / 2;
        }
        return -1;
    }
};
  1. 第二种呢?
while(left < right)

经过上面的思考,我们发现不会出现死循环了,因为left < right,所以我们也不需要right = mid -1;

所以最终代码为:

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

标签:right,return,target,nums,随想录,mid,----,做题,left
From: https://www.cnblogs.com/luo-greenhand/p/17804150.html

相关文章

  • 刘铭诚:11.1-2美盘黄金行情涨跌走势解析及期货原油价格操作建议
    黄金行情走势分析——白盘波动不大,午间下跌预期给到1975一线入场多单,目前到达1983一线,短线拿到8个点。整体来看今日的波动振幅还没有打开,但是从相关美元指数来看比较利好美元,目前更是来到106.85.晚间有望向107水平关口发起冲锋,届时黄金还会承受打击下跌。昨日黄金受到多次......
  • Linux操作系统
    一.什么是LinuxLinux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和64位硬件。二.Linux的特点(1)Linux是一款免费的操作系统,用户可以通过网络或......
  • Python JSON 使用指南:解析和转换数据
    JSON是一种用于存储和交换数据的语法。JSON是文本,使用JavaScript对象表示法编写。Python中的JSONPython有一个内置的json包,可用于处理JSON数据。示例:导入json模块:importjson解析JSON-从JSON转换为Python如果您有一个JSON字符串,可以使用json.loads()......
  • 如何在 Deepin 上安装 ONLYOFFICE 桌面编辑器 7.5
    ONLYOFFICE 桌面编辑器是一款基于依据 AGPL v.3 许可进行分发的开源办公套件。使用这款应用,您无需保持网络连接状态即可处理存储在计算机上的文档。本指南会向您介绍,如何在 Deepin上安装 ONLYOFFICE 桌面编辑器。ONLYOFFICE桌面版是什么ONLYOFFICE编辑器桌面版是一款全面......
  • Global Warming
      Sealevelrise:Theissueofglobalwarmingleadingtosealevelrisehasbeenraisedforalongtime.Globalwarmingiscausingasignificantamountofglacierstograduallymeltandflowtowardsthesea.Risingsealevelsmayinundatecoastallowlan......
  • Java工程师必备-一些资料的整理
    [Java工程师必备+学习+知识点+面试]:包含计算机网络知识、JavaSE、JVM、Spring、Springboot、SpringCloud、Mybatis、多线程并发、netty、MySQL、MongoDB、Elasticsearch、Redis、HBASE、RabbitMQ、RocketMQ、Pulsar、Kafka、Zookeeper、Linux、设计模式、智力题、项目架构、分布式......
  • 探索在openebs中使用lvm做持久化
    1.部署官网:https://openebs.iolvm项目地址:https://github.com/openebs/lvm-localpv1.1.本地创建vgaptinstalllvm2-ylsblk#创建pv和vgsudopvcreate/dev/loop0sudovgcreatelvmvg/dev/loop0注意:这里根据自己需求看是否全部的node节点都需要使用lvm做本地存储,也可......
  • css选择器的应用
    css中的选择器有多种,他们的优先级(权重):标签选择器<class选择器<id选择器<!important1.标签指定选择器div.box{}2.子代选择器ul>li>ol>li{}3.后代选择器ulli{}4.并集选择器box,div,p{}案例:完成以下案例答案:......
  • k8s查看资源所在的组和是否namespaced等信息
    k8s1.19.0[root@node1~]#kapi-resources-owideNAMESHORTNAMESAPIGROUPNAMESPACEDKINDVERBSbindings......
  • Oracle DataGuard的架构(面试)
    概述PrimaryDatabase主库处于open状态对外提供服务,用户在PrimaryDatabase上进行操作,操作被记录在联机日志和归档日志中。需要设置loggingforce模式:即使在归档模式下,也可能会有一些有nologging的操作不产生redo,这在DG下是不允许的,因此必须启用数据库强制记录redo。StandbyDat......