首页 > 其他分享 >在排序数组中查找元素的第一个和最后一个位置

在排序数组中查找元素的第一个和最后一个位置

时间:2024-04-03 23:58:20浏览次数:15  
标签:size right target nums int 查找 数组 排序 left

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

题目描述

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

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

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

示例 1:

输入:nums = [5,7,7,8,8,10]
, target = 8
输出:[3,4]

示例 2:

输入:nums = [5,7,7,8,8,10]
, target = 6
输出:[-1,-1]

示例 3:

输入:nums = [], target = 0
输出:[-1,-1]

题解 

二分法寻找左边界

int getLeft(vector<int>& nums,int target)
{
    int left=0,right=nums.size()-1;
    while(left<=right)
    {
        int mid=left+((right-left)>>1);
        if(target<=nums[mid])
        {
            right=mid-1;
        }else{
            left=mid+1;
        }
    }

    return left;
}

使用该算法寻找左边界时

  • 如果能够找到,则返回左边界
  • 如果没有找到则返回target的插入位置

二分法寻找右边界

int getRight(vector<int>& nums,int target)
{
    int left=0,right=nums.size()-1;
    while(left<=right)
    {
        int mid=left+((right-left)>>1);
        if(target<nums[mid])
        {
            right=mid-1;
        }else{
            left=mid+1;
        }
    }
    return right;
}

使用该算法寻找左边界时

  • 如果能够找到,则返回右边界
  • 如果没有找到则返回target的插入位置的前一个索引

故本题解法为

class Solution {
private:
    //寻找左边界
    int getLeft(vector<int>& nums,int target)
    {
        int left=0,right=nums.size()-1;
        while(left<=right)
        {
            int mid=left+((right-left)>>1);
            if(target<=nums[mid])
            {
                right=mid-1;
            }else{
                left=mid+1;
            }
        }
        return left;
    }
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        int left=getLeft(nums,target);
        //如果返回的left>=nums.size()说明target不存在,且其大小在区间外
        //如果nums[left]!=target,说明target不存在,但其大小在区间内部
        if(left>= nums.size() || nums[left]!=target)
            return {-1,-1};
        int right=getLeft(nums,target+1)-1;//寻找右边界
        return {left,right};
    }
};

标签:size,right,target,nums,int,查找,数组,排序,left
From: https://blog.csdn.net/qq_58158950/article/details/137360667

相关文章

  • 翻转数组
    publicclassexample{ publicstaticvoidmain(String[]args){ intarr[]={1,2,3,4,5,6}; inttemp=0; intlen=arr.length; for(inti=0;i<len/2;i++){ temp=arr[len-1-i]; arr[len-1-i]=arr[i]; arr[i]=tem......
  • Java归并排序知识点(含面试大厂题和源码)
    归并排序是一种有效的排序算法,采用分治法(DivideandConquer)策略。它将数组分成两半,对每一半递归地进行排序,然后将两个有序的半部分合并成一个整体的有序数组。归并排序在最坏情况、平均情况和最好情况下都保持(O(n\logn))的时间复杂度,是一种稳定的排序算法。由于其分而治......
  • Java快速排序知识点(含面试大厂题含源码)
    快速排序是一种高效的排序算法,由C.A.R.Hoare在1960年提出。它的基本思想是分而治之(DivideandConquer)。快速排序的关键在于选取一个“基准值”(pivot),然后将数组分为两个子数组:一个包含所有小于基准值的元素,另一个包含所有大于基准值的元素。这个过程称为“分区”(partitio......
  • python如何对二维数组排序
    在Python中对二维数组进行排序是一个常见的需求,可以通过多种方式实现。在本博客中,我们将讨论几种常见的方法来对二维数组进行排序。首先,我们可以使用Python的内置函数sorted()对二维数组进行排序。sorted()函数可以接受一个key参数,通过指定key参数来指定排序的方式。下面是......
  • 算法之查找
    1、顺序查找:packagecom.arithmetic.search;//顺序查找//sequentialSearch方法接收一个整数数组和一个目标元素作为参数,并使用顺序查找的方式在数组中查找目标元素。//它通过循环遍历数组元素,逐个与目标元素比较,如果找到了目标元素,则返回其索引位置。//如果遍历完整个数......
  • 2024.3.8力扣每日一题——找出美丽数组的最小和
    2024.3.8题目来源我的题解方法一数学题目来源力扣每日一题;题序:2834我的题解方法一数学经过分析,在target之前,取小于等于target/2的正整数才能使得和最小,并且满足条件3。时间复杂度:O(n)空间复杂度:O(n)publicintminimumPossibleSum(intn,inttarget)......
  • 2、excel的循环查找vloopup函数
    excel的循环查找vloopup函数1、基本语法vloopup(查找值,数据表,显示列,匹配方式)=vloopup(A1,H2:G5,1,0)匹配方式:0为精准匹配,1为模糊匹配2、实例1ABCDE2小米12小红=vloopup(D1,A2:B5,1,0)3小花134小红145小明15=vloopup(D1......
  • 详解volatile 关键字的作用,Java 中能创建 volatile 数组吗
    该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点面试官:volatile关键字的作用可见性:当一个线程修改了volatile变量的值,这个新值对于其他线程是立即可见的。这是因为在多线程环境下,线程在修改volatile变量的值时......
  • 用c++实现百元买百鸡问题、顺序查找
    5.1.2百元买百鸡问题【问题】已加公鸡5元一只,母鸡3元一只,小鸡1元三只,用100元钱买100只鸡, 问公鸡、母鸡、小鸡各多少只?【想法】 设公鸡、母鸡和小鸡的个数分别为x、y、z,则有如下方程组成立,则百元买百鸡问题转换为求方程组的解。应用蛮力法求力程组的解只能依次试探变量x......
  • KES中数组和集合类型的区别
    文章概要:本文属于学习总结系列,总结了一下数组类型和PL/SQL中集合类型及其使用区别。一,集合(collection)数据它是存放一组数据类型相同的数据,是一组相同类型元素的集合集合数据类型分三类:1).关联数组(indexbytables)元素下标:binary_integer、pls_integer、varchar2字符串......