Java程序设计:在排序数组中查找元素的第一个和最后一个位置(LeetCode:34)

题目:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]

示例 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]

class Solution {
public int[] searchRange(int[] nums, int target) {
//nums为升序排列的数组,target为目标值
int[] res = new int[]{-1,-1};
int startIndex;
int endIndex;
boolean flag = false;
LinkedHashMap<Integer,Integer> map = new LinkedHashMap<Integer,Integer>();
for(int i=0;i<nums.length;i++){
if(target == nums[i]) {
map.put(i,nums[i]);
flag = true;
}
}
if(!flag){
return res;
}
Map.Entry<Integer, Integer> k1 = getHead(map);
Map.Entry<Integer, Integer> k2 = getTail(map);
res[0] = k1.getKey();//第一个下标
res[1] = k2.getKey();//最后一个下标
return res;
}
//取有序链表的第一个键值对
public Map.Entry<Integer, Integer> getHead(LinkedHashMap<Integer,Integer> map) {
Map.Entry<Integer, Integer> entry = map.entrySet().iterator().next();
return entry;
}


//取有序链表的最后一个键值对
public Map.Entry<Integer, Integer> getTail(LinkedHashMap<Integer,Integer> map) {
Iterator<Map.Entry<Integer, Integer>> iterator = map.entrySet().iterator();
Map.Entry<Integer, Integer> tail = null;
while (iterator.hasNext()) {
tail = iterator.next();
}
return tail;
}
}

测试用例一:

测试用例二:

 

二分法查找思想:用二分查找思想找到target,然后在往前后找出所有的target,从而确认范围

class Solution {
public int binarySearch(int[] nums, int target) {
if (nums == null || nums.length == 0) {
return -1;
}
int l = 0;
int r = nums.length - 1;
while (l <= r) {
int middle = (l + r) / 2;
if (nums[middle] == target) {
return middle;
} else if (nums[middle] > target) {
r = middle - 1;
} else {
l = middle + 1;
}
}
return -1;
}

public int[] searchRange(int[] nums, int target) {
int[] arr = { -1, -1 };
if (nums == null || nums.length == 0) {
return arr;
}
int index = binarySearch(nums, target);
if (index == -1) {
return arr;
}
int l = index - 1;
while (l >= 0 && nums[l] == target) {
--l;
}
arr[0] = l + 1;
int r = index + 1;
while (r < nums.length && nums[r] == target) {
++r;
}
arr[1] = r - 1;

return arr;
}
}
原文地址:https://www.cnblogs.com/Yi-ling/p/14068811.html