在排序数组中查找元素的第一个和最后一个位置
leetcode题目位置
在排序数组中查找元素的第一个和最后一个位置
思路一: 在数组A中找到target的位置后再循环遍历该位置的左右来确定元素的第一个位置和最后一个位置
时间复杂度:O(logn)~O(n)
原因分析:当所有元素均为target时,性能最差为O(n)
//查找元素的第一个和最后一个位置
public static int[] searchRange(int[] nums, int target) {
//数组长度
int length = nums.length;
//特丽判断
if (length == 0)
return new int[]{-1, -1};
if (length == 1)
return target == nums[0] ? new int[]{0, 0} : new int[]{-1, -1};
//定义双指针
int low = 0;
int high = length - 1;
while (low <= high) {
int mid = low + ((high - low) >> 1);
//寻找相等的位置
if (nums[mid] > target)
high = mid - 1;
else if (nums[mid] < target)
low = mid + 1;
else {
//定义范围指针
int left = mid;
int right = mid;
//使用while 循环来确定范围指针的位置
while (left != 0 && nums[left - 1] == target)
left--;
while (right != length - 1 && nums[right + 1] == target)
right++;
return new int[] {left,right};
}
}
return new int[]{-1, -1};
思路二:因为是寻找target再数组中的位置,我们可以定义一个新的函数来确定数组中第一个大于等于target的位置和数组中第一个大于target的位置,最后再校验确定二者的位置。
时间复杂度:O(logn)
//先找>=target的第一个
//再找>target的第一个
public int[] searchRangeA(int[] nums, int target) {
int length = nums.length;
//特例判断
if (length == 0 || (length == 1) && nums[0] != target)
return new int[]{-1, -1};
//寻找target在数组A中的位置 以及target + 1在数组A中的位置
//但是target + 1在数组中不一定存在,需要进一步判断
int left = searchRangeLeft(nums, target);
int right = searchRangeLeft(nums, target + 1);
//判断left的值或者left位置的元素值是否为target
if (left == -1 || nums[left] != target)
return new int[]{-1, -1};
//判断right位置是否存在
if (right != -1)
return new int[]{left, right - 1};
else
return new int[]{left, length - 1};
}
//找>=target的第一个
public static int searchRangeLeft(int[] nums, int target) {
int length = nums.length;
int low = 0;
int high = length - 1;
while (low <= high) {
int mid = low + ((high - low) >> 1);
if (nums[mid] >= target) {
if (mid == 0 || nums[mid - 1] < target)
return mid;
else
high = mid - 1;
} else
low = mid + 1;
}
return -1;
}