0%

力扣每日一题2021/9/12

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

给定一个按照升序排列的整数数组 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 <= 10^5
  • -10^9 <= nums[i] <= 10^9
  • nums 是一个非递减数组
  • -10^9 <= target <= 10^9

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

  1. 暴力解法
  2. 双指针
  3. 二分查找

解题代码

暴力解法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public int[] searchRange(int[] nums, int target) {
int l = -1, r = -1;
for (int i = 0; i < nums.length; i++){
if (nums[i] == target){
if (l == -1 && r == -1){
l = r = i;
}else {
r = i;
}
}
}
return new int[]{l, r};
}
}

双指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public int[] searchRange(int[] nums, int target) {
int[] ans = {-1,-1};
int left = 0, right = nums.length - 1;
while (left <= right){
if (nums[left] == target && ans[0] == -1){
ans[0] = left;
}else if (nums[right] == target && ans[1] == -1){
ans[1] = right;
}else if (ans[0] == -1){
left++;
}else if (ans[1] == -1){
right--;
}else {
break;
}
}
return ans;
}
}

二分查找(参考官解评论区大佬代码)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public int[] searchRange(int[] nums, int target) {
int l = binarySearch(nums, target);
int r = binarySearch(nums, target + 1);
if (l < nums.length && nums[l] == target){
return new int[]{l, r - 1};
}
return new int[]{-1, -1};
}
public int binarySearch(int[] nums, int target) {
int l = 0, r = nums.length;
while (l < r){
int mid = (l + r) / 2;
if (nums[mid] >= target){
r = mid;
}else {
l = mid + 1;
}
}
return l;
}
}