在排序数组中查找元素的第一个和最后一个位置
此博客链接:https://www.cnblogs.com/ping2yingshi/p/14066225.html
在排序数组中查找元素的第一个和最后一个位置
题目
给定一个按照升序排列的整数数组 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 <= 105
-109 <= nums[i] <= 109
nums 是一个非递减数组
-109 <= target <= 109
题解
思路1:遍历数组,找第一个值和给定的值相等,把下标存入到数组中,找最后一个和给定的值相等的下标,把下标存入到数组中。
思路2:利用哈希表,把数组中的数存到Key中,把对应的下标存到value中。判断给定的目标是否在key中,如果存在,返回value中的第一个数和最后一个数,如果value中只有一个数,则返回两次。如果key中不存在和给定的值相等的数,那么返回[-1,-1]。
方法1:
1.循环遍历数组。
2.判断第一个数和给定目标相等,把下标存入到数组中。
3.判断第二个数和给定目标是否相等,如果相等并且下一个数和给的目标不相等,则返回当前下标。当然还需要判断是否到达数组的长度。
方法2:
1.形成哈希表。
2.找key中和给定目标中相等的数。
3.如果存在返回value中的值,如果没有返回[-1,-1]。
代码1:我好像硬编码了,按照示例写的代码,也是没谁了。
代码2:
class Solution { public int[] searchRange(int[] nums, int target) { Map <Integer,ArrayList> map=new HashMap(); for(int i=0;i<nums.length;i++) { ArrayList list=new ArrayList(); if(map.get(i)==null) map.put(nums[i],list); else map.get(i).add(i); } for(Integer tem:map.keySet()) { if(tem==target) { ArrayList list=map.get(tem); return new int []{int(list.get(0)),int(list.get(list.size()-1))}; } } return new int[]{-1, -1}; } }
以上代码报错,报错信息如下。
查找原因,看第一个报错就懵了,我没有定义类啊。
查找原因,报错所在行中,Integer转换成int类型时,应该把int使用()括起来。
运行程序,运行结果和案例结果不一致,如下图所示,分析结果,发现没有显示3,而3是在4前面的,应该是少添加一个数,查找发现当key不存在时,没有把下标值加入到list中。
正确代码
class Solution { public int[] searchRange(int[] nums, int target) { Map <Integer,ArrayList> map=new HashMap(); for(int i=0;i<nums.length;i++) { ArrayList list=new ArrayList(); if(map.get(nums[i])==null) { list.add(i); map.put(nums[i],list); } else { map.get(nums[i]).add(i); } } for(Integer tem:map.keySet()) { if(tem==target) { ArrayList list=map.get(tem); return new int[]{(int)(list.get(0)),(int)(list.get(list.size()-1))}; } } return new int[]{-1, -1}; } }