持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天。
题目链接: leetcode.com/problems/fi…
1. 题目介绍(在排序数组中查找元素的第一个和最后一个位置)
Given an array of integers nums sorted in non-decreasing order, find the starting and ending position of a given target value.
【Translate】: 给定一个整数数组,nums按非递减顺序排序,找出给定目标值的起始和结束位置。
If target is not found in the array, return [-1, -1].
【Translate】: 如果target没有在数组中找到,则返回[-1,-1]。
You must write an algorithm with O(log n) runtime complexity.
【Translate】: 你必须写一个运行复杂度为O(log n)的算法。
【测试用例】:
【约束】:
2. 题解
2.1 暴力穷举 -- O(n)
无脑穷举,前一个,后一个,直接遍历,虽然很爽,但是不符合题目要求。
public int[] searchRange(int[] nums, int target) {
int[] res = {-1,-1};
for (int i = 0; i < nums.length; i++)
{
if (nums[i] == target)
{
res[0] = i;
break;
}
}
for (int i = nums.length-1; i >= 0; i--)
{
if (nums[i] == target)
{
res[1] = i;
break;
}
}
return res;
}
2.2 二分查找 -- O(logn)
atwenbobu提供的题解 Easy java O(logn) solution ,应用了两次二分查找来找到目标元素的每个索引。可和上一题【LeetCode】No.33. Search in Rotated Sorted Array -- Java Version做一个参考。
public int[] searchRange(int[] nums, int target) {
int[] result = new int[2];
result[0] = findFirst(nums, target);
result[1] = findLast(nums, target);
return result;
}
private int findFirst(int[] nums, int target){
int idx = -1;
int start = 0;
int end = nums.length - 1;
while(start <= end){
int mid = (start + end) / 2;
if(nums[mid] >= target){
end = mid - 1;
}else{
start = mid + 1;
}
if(nums[mid] == target) idx = mid;
}
return idx;
}
private int findLast(int[] nums, int target){
int idx = -1;
int start = 0;
int end = nums.length - 1;
while(start <= end){
int mid = (start + end) / 2;
if(nums[mid] <= target){
start = mid + 1;
}else{
end = mid - 1;
}
if(nums[mid] == target) idx = mid;
}
return idx;
}