首页 > 编程语言 >【算法】【线性表】【数组】在排序数组中查找元素的第一个和最后一个位置

【算法】【线性表】【数组】在排序数组中查找元素的第一个和最后一个位置

时间:2024-03-12 17:34:17浏览次数:24  
标签:return target nums int middle 查找 数组 线性表

1  题目

给你一个按照非递减顺序排列的整数数组 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]

提示:

  • 0 <= nums.length <= 105
  • -109 <= nums[i] <= 109
  • nums 是一个非递减数组
  • -109 <= target <= 109

2  解答

二分查找,找到位置,然后前后找区间:

class Solution {
    public int[] searchRange(int[] nums, int target) {
        // 默认返回
        int[] res = new int[]{-1, -1};
        if (nums == null || nums.length <= 0) {
            return res;
        }
        // 二分查找,找一个位置出来
        int index = twoSearch(nums, 0, nums.length - 1, target);
        if (index < 0) {
            return res;
        }
        // 左边
        for (int i = index; i >= 0; i--) {
            if (nums[i] == target) {
                res[0] = i;
                continue;
            }
            break;
        }
        // 右边
        for (int i = index; i < nums.length; i++) {
            if (nums[i] == target) {
                res[1] = i;
                continue;
            }
            break;
        }
        return res;
    }

    public static int twoSearch(int[] nums, int start, int end, int target) {
        if (start > end) {
            return -1;
        }
        int middle = start + (end - start) / 2;
        if (nums[middle] == target) {
            return middle;
        } else if (nums[middle] < target) {
            return twoSearch(nums, middle + 1, end, target);
        } else {
            return twoSearch(nums, start, middle - 1, target);
        }
    }
}

加油。

标签:return,target,nums,int,middle,查找,数组,线性表
From: https://www.cnblogs.com/kukuxjx/p/18068825

相关文章

  • 查找笔记本设备编号
    有一笔记本充不了电了,想着也过保了,交差也得查一下保修状况,上了官网,要求输入设备编号,是的,这个编号肯定是要的,结果输了一圈,什么serialnumber,typenumber,factoryid,complianceid,cmiidid,还是没有得到自己简单想要的,标签是哑光黑,看着费眼神,想来厂家为保密原因也可以理解,怎么编......
  • leetcode: 1261: 在受污染的二叉树中查找元素
    给出一个满足下述规则的二叉树:root.val==0如果 treeNode.val==x 且 treeNode.left!=null,那么 treeNode.left.val==2*x+1如果 treeNode.val==x 且 treeNode.right!=null,那么 treeNode.right.val==2*x+2现在这个二叉树受到「污染」,所有的 tree......
  • 洛谷题单指南-线性表-P1241 括号序列
    原题链接:https://www.luogu.com.cn/problem/P1241题意解读:括号配对问题,直观上是堆栈的应用。关键的匹配策略是读懂该句:考察它与它左侧离它最近的未匹配的的左括号。解题思路:本题所需核心数据结构是堆栈,由于要实现从栈顶找到第一个未匹配的左括号,所以堆栈中只存所有左括号。从......
  • 洛谷题单指南-线性表-P2058 [NOIP2016 普及组] 海港
    原题链接:https://www.luogu.com.cn/problem/P2058题意解读:计算24小时时间窗口内不同国家的数量,是队列的典型应用。解题思路:本题需要用到两个关键的数据结构:队列、数组队列用来保存24小时内到达的船的时间,数组用来保存24小时内每个国家有多少人每到一只船,需要把时间放入队列,如......
  • 洛谷题单指南-线性表-P1540 [NOIP2010 提高组] 机器翻译
    原题链接:https://www.luogu.com.cn/problem/P1540题意解读:本题模拟内存的调入调出,内存先入先出的特性就是队列。解题思路:本题需要两种数据结构:队列、数组队列用来模拟内存的操作,数组充当hash表用于判断单词在内存是否存在核心逻辑:对于每一个单词,如果内存不存在,查一次词典,再将......
  • 【算法】【线性表】【链表】合并 K 个升序链表
    1 题目给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。示例1:输入:lists=[[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下:[1->4->5,1->3->4,2->6]将它们合并到一个有序链表中得到。1-......
  • (C++)树状数组和线段树的VSCode Snippet
    学都学了,肯定要往snippet里塞好东西嘛{ //Placeyoursnippetsforcpphere.Eachsnippetisdefinedunderasnippetnameandhasaprefix,bodyand //description.Theprefixiswhatisusedtotriggerthesnippetandthebodywillbeexpandedandinserted.......
  • labuladong_二维数组遍历
    1.二维数组进行旋转,图像顺时针旋转90度1.1我们可以先将 nxn 矩阵 matrix 按照左上到右下的对角线进行镜像对称:然后再对矩阵的每一行进行反转:发现结果就是 matrix 顺时针旋转90度的结果://将二维矩阵原地顺时针旋转90度 //逆时针旋转90度   ......
  • 洛谷题单指南-线性表-P1160 队列安排
    原题链接:https://www.luogu.com.cn/problem/P1160题意解读:本题是双向链表的模拟题,要快速实现M个节点的删除,用数组模拟链表是最佳做法。解题思路:双向链表关键要实现好两个操作:voidadd(intk,intv);//在第k个节点后增加第v的号节点,即在k号同学右边插入v号同学voiddel(int......
  • Qt 将16进制的内容的QString字符串转为QByteArray数组
    1.QString存储十六进制内容我要发送的十六进制内容是0105040100将其储存在QString字符串中1QStringstr;2str="0105040100";2.核心语句将两位的字符串转换为16进制的Int型数字,然后通过强制类型转换成char类型的字符。(具体作用方式我还没去看,但是有用)(char)str.m......