在排序数组中查找元素的第一个和最后一个位置

此博客链接:https://www.cnblogs.com/ping2yingshi/p/14066225.html

在排序数组中查找元素的第一个和最后一个位置

题目链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/solution/10000-9637-by-bobby996/

题目

给定一个按照升序排列的整数数组 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:我好像硬编码了,按照示例写的代码,也是没谁了。

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int result[]=new int [2];
        result[0]=result[1]=-120;
        for(int i=0;i<nums.length;i++)
        {
            if(nums[i]==target)
            {
                 if(nums.length==1)
                {
                    return new int[]{0,0};
                }
                if(nums[i+1]==target&&nums.length==2)
                {
                    return new int[]{0,1};
                }
                //找第一个数,有两种情况,第一种是数组中第一个数和给的数相等,则把给0下标存入到数组中,第二种情况,给的数不是第一个数,那需要找第一个和给的数相等的数组中的下标           
                if(i==0)
                {
                   if(nums[i]==target)
                     result[0]=0;
                       continue;
                }
                else if(nums[i]==target&&nums[i]!=nums[i-1])
                {
                      result[0]=i;
                       continue;
                }
                //找最后一个数,要判断后面一个数和给的那个的目标不相等,需要注意,要判断还有后一个数吗,要不会数组越界
                if(i<nums.length-1)
                {
                    if(nums[i]!=nums[i+1])
                        result[1]=i;
                        return result;
                }

            
                if(result[1]==0&&nums[nums.length-1]==target)
                    result[2]=nums[nums.length-1];
                    return result;
               
            }
        }
        return new int[]{-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};
    }
}

 

posted @ 2020-12-01 09:15  萍2樱释  阅读(212)  评论(1编辑  收藏  举报