-
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。
-
例 :
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4] -
输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]
public class LC34_FindElement {
public static void main(String[] args) {
int[] array = {1,2,5,5,9,21};
int[] ints = FindElement(array, 1);
int[] ints1 = FindElement_plus(array, 1);
System.out.println("["+ints[0] + "," + ints[1] + "]");
System.out.println("["+ints1[0] + "," + ints1[1] + "]");
}
/**
* 普通解法
* @param nums
* @param target
* @return
*/
private static int[] FindElement(int[] nums, int target) {
//定义一个结果集存储开始和结束下标
int[] result = {-1,-1};
//定义一个右指针
int left = 0;
int right = nums.length-1;
for (; left < nums.length; left++) {
if (nums[left] == target) {
result[0] = left;
for (; left <= right ; right--) {
if (nums[right] == target) {
result[1] = right;
return result;
}
}
}
}
return result;
}
/**
* 使用二分法,分别寻找左边界和右边界
* @param nums
* @param target
* @return
*/
private static int[] FindElement_plus(int[] nums, int target) {
//定义一个结果集
int[] result = {-1,-1};
//true代表寻找左边界,false代表寻找右边界
result[0] = binarySearch(nums,target,true);
result[1] = binarySearch(nums,target,false);
return result;
}
private static int binarySearch(int[] nums, int target, boolean b) {
int res = -1;
//定义一个左指针
int left = 0;
//定义一个右指针
int right = nums.length-1;
while (left <= right) {
//定义一个中间指针
int mid = (left + right) / 2;
if (nums[mid] > target) {
right = mid -1;
} else if ( nums[mid] < target ) {
left = mid + 1;
} else if ( nums[mid] == target ) {
res = mid;
if (b) {
//寻找左边界,right = mid-1 将整个寻找的区域向左移动
right = right - 1;
} else {
//寻找右边界,left = mid+1 将整个寻找的区域向右移动
left = left + 1;
}
}
}
return res;
}
}