当前位置: 首页 > news >正文

蓝桥杯入门即劝退(十六)查找元素范围(双解法)

欢迎===关注===点赞===评论,共同学习,共同进步!

------持续更新蓝桥杯入门系列算法实例--------

如果你也喜欢Java和算法,欢迎订阅专栏共同学习交流!

你的点赞、关注、评论、是我创作的动力!

-------希望我的文章对你有所帮助--------

前言:又到了好玩刺激的算法题了,由浅入深的讲解,才能对本道算法题发挥其作用,建议先自己思考做一遍,如果不对或有疑惑再来看题解。

->力扣链接 

一、题目描述

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

 

解题思路:1、按题意可知必须写一个时间复杂度为O(log n)的算法,如果不限定的话,直接遍历累加target数量返回下标就过于简单了。

2、我们使用二分查找可以满足时间复杂度的要求,这里先讲解一个简单版,便于理解。

【简易版】

1、新建一个result数组用于返回。

2、确定两个边界left、right为数组开头和结尾元素。

3、在两个指针相遇前分别进行遍历

4、分别可以获得第一个target下标和最后一个target下标

public int[] searchRange2(int[] nums, int target) {//简单解法,时间复杂度高
            int[] result = new int[] {-1, -1};//创建新数组用于返回
            int right = nums.length - 1;//右边界
            int left = 0;//左边界
            while (left <= right) {
                if (nums[left] == target && nums[right] == target) {
                    result[0] = left;//获得第一个target下标
                    result[1] = right;//最后一个target下标
                    break;
                }
                if (nums[left] < target) {//向左遍历
                    left++;
                }
                if (nums[right] > target) {//向右遍历
                    right--;
                }
            }
            return result;
        }

【进阶版】

1、进阶解法本质也是二分查找,通过两次左右边界的查找,来确定target的范围。

2、通过第一次查找左边界target位置。

3、通过查找target右边的一个元素位置,即间接的获得最后一个target的下标。

4、需满足左边界小于等于右边界,且右边界不超出数组长度,且两个边界值均为target。

public int[] searchRange(int[] nums, int target){
        if (nums.length==0)
            return new int[]{-1,-1};
        int LeftInd=BinarySearch(nums,target);//左边target下标
        int RightInd=BinarySearch(nums,target+1)-1;//右边界target下标
       if (LeftInd<=RightInd&&RightInd<=nums.length&&nums[LeftInd]==target&&nums[RightInd]==target)
            return new int[]{LeftInd,RightInd};
       else   return new int[]{-1,-1};
    }
    public int BinarySearch(int nums[],int target){
        int left=0;
        int right=nums.length;
        while (left<right){
            int mid=left+(right-left)/2;
            if (target<=nums[mid]){逐渐左移,找到最左边的target
                right=mid;
            }
            else  left=mid+1;
        }
        return left;//返回的是第一个target下标
    }

 

发文不易,恳请大佬们高抬贵手!


点赞:随手点赞是种美德,是大佬们对于本人创作的认可!


评论:往来无白丁,是你我交流的的开始!


收藏:愿君多采撷,是大佬们对在下的赞赏!

相关文章:

  • Servlet转发与重定向
  • 【C语言进阶】参加面试怎能不会结构体?进来学,手把手教会你结构体的原理与使用
  • JSP运动会信息网站
  • 大数据呀大数据
  • C#编程基础(万字详解,这一篇就够了)
  • 滑动窗口的最大值【滑动窗口问题】
  • MYSQL 8.0 -- 事务中删除不存在的记录导致死锁
  • [1181]linux两台服务器之间传输文件和文件夹
  • 题:付账问题
  • python中的字典详解
  • C++11标准模板(STL)- 算法(std::minmax)
  • STM32F4 | PWM输出实验
  • Nginx快速入门笔记
  • Elasticsearch:基于文件的用户认证
  • 【C】带你复习有趣的函数
  • [case10]使用RSQL实现端到端的动态查询
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • CentOS6 编译安装 redis-3.2.3
  • Laravel Telescope:优雅的应用调试工具
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • mysql_config not found
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • RxJS: 简单入门
  • spring + angular 实现导出excel
  • Spring Boot MyBatis配置多种数据库
  • Spring Cloud中负载均衡器概览
  • Theano - 导数
  • vue-router的history模式发布配置
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 记录一下第一次使用npm
  • 近期前端发展计划
  • 浏览器缓存机制分析
  • 模型微调
  • 如何合理的规划jvm性能调优
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 云大使推广中的常见热门问题
  • 你对linux中grep命令知道多少?
  • 阿里云ACE认证学习知识点梳理
  • 湖北分布式智能数据采集方法有哪些?
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #if 1...#endif
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (HAL库版)freeRTOS移植STMF103
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (三分钟)速览传统边缘检测算子
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转载)虚函数剖析
  • .NET Micro Framework 4.2 beta 源码探析
  • .net对接阿里云CSB服务
  • .Net语言中的StringBuilder:入门到精通
  • @property python知乎_Python3基础之:property
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798