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

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

时间:2022-11-25 11:33:04浏览次数:71  
标签:right target nums int 34 查找 目标值 LeetCode left

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

​https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/​


题目描述:

给定一个按照升序排列的整数数组 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]


提示:

1. 0 <= nums.length <= 105

2. -109 <= nums[i] <= 109

3. nums 是一个非递减数组

4. -109 <= target <= 109


题目分析:

这道题我们通过二分查找的方法解决。首先我们要定义两个方法,一个是用二分查找法寻找元素第一次出现的位置,另一个是用二分查找法寻找元素最后一次出现的位置。下面讲一下寻找第一次出现元素位置的方法,定义左边界为0,右边界为数组长度,当左边界小于右边界时执行二分查找,先找出区间中点值,并与目标值比较,如果目标值与中点值相同或者目标值小于中点值,缩小范围至左子区间,否则缩小范围至右子区间。如果左边界到达数组尾或者左边界值移动到最后还找不到与目标相同的值则返回-1,否则返回元素第一次出现的位置。同理我们可以写出寻找最后一次出现元素位置的方法,最后调用这两个方法获取位置值返回即可。


题解:

执行用时: 0 ms

内存消耗: 41.2 MB

class Solution {
public int[] searchRange(int[] nums, int target) {
// 调用方法 实现返回 第一次元素出现位置 和 最后一次元素出现位置
return new int[]{findLeft(nums, target), findRight(nums, target)};
}


// 寻找第一次出现元素位置的方法
public int findLeft(int[] nums, int target) {
// 定义左右边界
int left = 0, right = nums.length;
// 当左边界小于右边界时执行循环
while (left < right) {
// 定义区间中点
int mid = left + (right - left) / 2;
// 如果目标值与中点值相同或者目标值小于中点值,缩小范围至左子区间
if (target <= nums[mid])
// 移动右边界界线
right = mid;
// 如果目标值大于中点值,缩小范围至右子区间
else if (target > nums[mid])
// 移动左边界界线
left = mid + 1;
}
// 如果左边界到达数组尾 或者 左边界值移动到最后还找不到与目标相同的值
if (left == nums.length || nums[left] != target)
// 则返回-1
return -1;
// 返回元素第一次出现的位置
return left;
}


// 寻找最后一次出现元素位置的方法
public int findRight(int[] nums, int target) {
// 定义左右边界
int left = 0, right = nums.length;
// 当左边界小于右边界时执行循环
while (left < right) {
// 定义区间中点
int mid = left + (right - left) / 2;
// 如果目标值与中点值相同或者目标值大于中点值,缩小范围至右子区间
if (target >= nums[mid])
// 移动左边界界线
left = mid + 1;
// 如果目标值小于中点值,缩小范围至左子区间
else if (target < nums[mid])
// 移动右边界界线
right = mid;
}
// 如果右边界到达数组头 或者 右边界值移动到最后还找不到与目标相同的值
if (right == 0 || nums[right - 1] != target)
// 则返回-1
return -1;
// 返回元素最后一次出现的位置
return right - 1;
}
}


题目来源:力扣(LeetCode)


标签:right,target,nums,int,34,查找,目标值,LeetCode,left
From: https://blog.51cto.com/u_15891283/5886073

相关文章

  • LeetCode 76.最小覆盖子串
    LeetCode76.最小覆盖子串题目链接:​​https://leetcode-cn.com/problems/minimum-window-substring/​​题目描述:给你一个字符串 s 、一个字符串 t 。返回 s 中涵......
  • 每日算法之二维数组中的查找
    JZ4二维数组中的查找描述在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这......
  • leetcode 104. 二叉树的最大深度 js实现
    给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null......
  • leetcode 344. 反转字符串 js实现
    编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解......
  • leetcode 21. 合并两个有序链表 js实现
    将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例1:输入:l1=[1,2,4],l2=[1,3,4]输出:[1,1,2,3,4,4]示......
  • leetcode_Day2_35搜索插入位置
    1.题目  2.解一 主要思路:二分法,不多赘述,为题目所给标准解法。3.解二   主要思路:循环对比,自己想的,感觉写的非常冗余,内存占用和速度都很大。不过没学过算法,......
  • leetcode 19. 删除链表的倒数第 N 个结点 js实现
    给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。示例1:输入:head=[1,2,3,4,5],n=2输出:[1,2,3,5]示例2:输入:head=[1],n=1输出:[]示例3:......
  • 算法5: LeetCode_单链表_两数相加
    题目:*给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。*请你将两个数相加,并以相同形式返回一个......
  • LeetCode刷题记录.Day24
    有效的括号20.有效的括号-力扣(LeetCode)classSolution{public:boolisValid(strings){if(s.size()%2!=0)returnfalse;//奇数必不符合......
  • 2022NOIP A层联测34 bs 串 英语作文 计算器 愤怒的小鸟
    T1[图论:并查集维护寻找特殊环]给出一个无向图,点权是0或者1,你可以从任意起点出发,每到达一个点,把这个点的权值放到你构造的字符串的末尾,并且这个点的权值取反。给出K次操作,......