Leetcode——在排序数组中查找元素的第一个和最后一个位置
Posted Yawn,
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode——在排序数组中查找元素的第一个和最后一个位置相关的知识,希望对你有一定的参考价值。
1. 在排序数组中查找元素的第一个和最后一个位置
跟在排序数组中查找数字 I(二分查找).解法基本一致
(1)二分(找双边界)
class Solution {
public int[] searchRange(int[] nums, int target) {
int n = nums.length;
int a = -1, b = -1; //分别存储左右边界
boolean flag = false;
//寻找左边界
int left = 0, right = n;
while (left < right) {
int mid = left + (right - left) / 2 ;
if (nums[mid] == target) {
flag = true;
right = mid;
}
else if (nums[mid] < target)
left = mid + 1;
else if (nums[mid] > target)
right = mid;
}
a = left;
//寻找右边界
left = 0;
right = n;
while (left < right) {
int mid = left + (right - left) / 2 ;
if (nums[mid] == target) {
flag = true;
left = mid + 1;
}
else if (nums[mid] < target)
left = mid + 1;
else if (nums[mid] > target)
right = mid;
}
//这里的right指目标值最后分割点,寻找到目标值后left = mid + 1; 所以需要减1
b = left - 1;
if (!flag)
return new int[]{-1, -1};
return new int[]{a, b};
}
}
(2)二分(找右边界)
class Solution {
public int[] searchRange(int[] nums, int target) {
int n = nums.length;
int a = -1, b = -1; //分别存储左右边界
boolean flag = false;
//寻找右边界
int left = 0, right = n;
while (left < right) {
int mid = left + (right - left) / 2 ;
if (nums[mid] == target) {
flag = true;
left = mid + 1;
}
else if (nums[mid] < target)
left = mid + 1;
else if (nums[mid] > target)
right = mid;
}
//这里的right指目标值最后分割点,寻找到目标值后left = mid + 1;
right = left - 1;
//找左边界
left = right;
while (left >= 0 && nums[left] == target) { //判断right > 0 即可
left--;
}
if (!flag)
return new int[]{-1, -1};
return new int[]{left + 1, right}; //找左边界时,left--不满足>0 才返回,所以需要+1
}
}
(3)二分(找左边界)
class Solution {
public int[] searchRange(int[] nums, int target) {
int n = nums.length;
int a = -1, b = -1; //分别存储左右边界
boolean flag = false;
//寻找左边界
int left = 0, right = n;
while (left < right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
flag = true;
right = mid;
//区间为[0,n) 左闭右开:nums[mid] == target,下一个值为mid + 1
//[0,mid),不包括mid
}
else if (nums[mid] > target)
right = mid;
else if (nums[mid] < target)
left = mid + 1;
}
//找左边界
right = left;
while (right < n && nums[right] == target) { //判断right > 0 即可
right++;
}
if (!flag)
return new int[]{-1, -1};
return new int[]{left, right - 1}; //找右边界时,right++不满足< n 才返回,所以需要-1
}
}
以上是关于Leetcode——在排序数组中查找元素的第一个和最后一个位置的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode | 0034. 在排序数组中查找元素的第一个和最后一个位置Python
LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置 | Python
《LeetCode之每日一题》:90.在排序数组中查找元素的第一个和最后一个位置
5-003-(LeetCode- 34) 在排序数组中查找元素的第一个和最后一个位置