首页 > 编程语言 >算法练习:34. 在排序数组中查找元素的第一个和最后一个位置

算法练习:34. 在排序数组中查找元素的第一个和最后一个位置

时间:2024-11-26 21:01:11浏览次数:9  
标签:right1 left2 nums 34 left1 查找 排序 mid1 target

题目链接:34. 在排序数组中查找元素的第一个和最后一个位置

在这里我们可以用暴力的解法:就是一次判断,第一次遇见的元素==target,和最后一次遇见的,就保存起来

但是这样暴力解法时间复杂度为O(N)。时间复杂度超出了题目意思。

优化解法:因为数组是有序的,我们可以根据二分查找思想来进行解决,

利用二短性来进行,左右分段来查询边界

思路画图所示:

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        int left1 = 0, left2 = 0, right1 = nums.size() - 1, right2 = nums.size() - 1;
        if (right1 < 0) return { -1,-1 }; //当是空数组时,right会小于0,这时直接退出就行
        while (left1 < right1)//不能等于,如果等于就会,一直right1 = mid1死循环
        {
            int mid1 = left1 + (right1 - left1) / 2;//优先左取整
            if (nums[mid1] < target) left1 = mid1 + 1;
            else if (nums[mid1] >= target) right1 = mid1;
        }
        while (left2 < right2)
        {
            int mid2 = left2 + (right2 - left2 + 1) / 2;//优先右取整
            if (nums[mid2] <= target) left2 = mid2;
            else if (nums[mid2] > target) right2 = mid2 - 1;
        }
        if (nums[right1] != target && nums[left2] != target) return { -1,-1 };//最后判断所处位置如果不是target,肯定不存在,直接返回
        return { right1,left2 };
    }
};

 

标签:right1,left2,nums,34,left1,查找,排序,mid1,target
From: https://blog.csdn.net/2302_80652761/article/details/144067279

相关文章

  • JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化
    目录JavaScript中通过Array.sort()实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)一、为什么要使用Array.sort()二、Array.sort()的使用与技巧1、基础语法2、返回值3、使用技巧三、Array.sort()的复杂用法与实际......
  • Realtek网卡MAC刷新工具PG8168.exe Version:2.34.0.4使用说明
    本刷新工具虽然文件名叫PG8168.EXE,但不是只有RTL8168可用,是这一个系列的产品都可以使用。实验证明RTL8111也可以使用。用法:PG8168[/h][/?][/b][/cHexOffsetHexValue][/dNICNumber][/l][/r][/w][/v][/#NICNumber][/nodeidHexNODEID][/svidHexSVIDHexSMID][/uuidHe......
  • COMP4134 Algorithms and Data Structures
    ProjectinAdvancedAlgorithmsandDataStructuresCOMP4134UNNCOverviewForthisproject,youaretaskedwithsolvingareal-worldtransportationproblem.Formallyspeaking,itiscalledthepickupanddeliveryproblemwithtimewindows(PDPTW).Thepi......
  • LeetCode234 回文链表
    LeetCode234回文链表题目链接:LeetCode描述给你一个单链表的头节点head,请你判断该链表是否为回文链表。如果是,返回true;否则,返回false。示例输入:head=[1,2,2,1]输出:true输入:head=[1,2]输出:false方法一思路首先找到链表的中间结点mid:如果链表有奇数个节......
  • ABAP开发学习——二分法查找问题记录
    在ABAP中使用二分法查找之前需要注意内表需要提前经过排序,尤其注意根据哪个字段使用BINARYSEARCH,就要针对哪个字段进行排序。使用两个及以上字段更要注意这一点,不可以用AB排序,再用BC去二分法查找,这样通常是读不到所需数据的。TYPES:BEGINOFty_data,field1TYP......
  • 查找相关知识点
    一.基本概念1.查找:在数据集合中寻找满足条件的数据元素2.查找表:用于查找的数据结合称之为查找表3.静态查找表(StaticSearchTable):只作查找操作的查找表。主要操作查询某个“特定的”数据元素是否在查找表中。检索某个“特定的”数据元素和各种属性。4.动态查找表(Dy......
  • 《安富莱嵌入式周报》第346期:开源2GHz带宽,12bit分辨率,3.2Gsps采样率示波,开源固件安全
    周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 视频:https://www.bilibili.com/video/BV1TYBhYKECK/目录:1、开源2GHz带宽,12bit分辨率,3.2Gsps采样率示波器2、开源嵌入式固件安全分析器3、TI分享的8通道隔离±12.288V......
  • 代码随想录算法训练营第十一天(LeetCode150.逆波兰表达式求值;LeetCode239.滑动窗口最大
    LeetCode150.逆波兰表达式求值题目链接:逆波兰表达式求值题目链接思路主要是要理解逆波兰表达式的定义,在理解了逆波兰表达式的定义后,使用栈就可以直接做了。逆波兰表达式是一种后缀表达式,所谓后缀就是指运算符写在后面。平常使用的算式则是一种中缀表达式,如(1+2)......
  • 简易排序-初级程序-极语言教程
    //窗体代码:整数窗体,按钮1,标签2;程序资源24,"清单.xml";程序段加载窗体整数左=(桌面.宽-417)>>1,上=(桌面.高-321)>>1;窗体=创建窗口($100,程序.名称,"单线程排序",$14CF0064,左,上,417,321,0,0,0,0);按钮1=创建窗口($0,"Button","测试",$50000000,155,105,70,35,窗......
  • 排序-初级程序-极语言教程
    //窗体代码:整数窗体,按钮1,标签2;程序资源24,"清单.xml";程序段加载窗体整数左=(桌面.宽-417)>>1,上=(桌面.高-321)>>1;窗体=创建窗口($100,程序.名称,"单线程排序",$14CF0064,左,上,417,321,0,0,0,0);按钮1=创建窗口($0,"Button","测试",$50000000,155,105,70,35,窗......