zoukankan      html  css  js  c++  java
  • 在排序数组中查找元素的第一个和最后一个位置

    此博客链接: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};
        }
    }
    出来混总是要还的
  • 相关阅读:
    Caffe proto閱讀
    C++ 基本知識回顧
    Caffe 源碼閱讀(二) SyncedMemory.hpp
    Caffe 源碼閱讀(一) Blob.hpp
    Matlab
    python
    MxNet下训练alexnet(一)
    服务器自己用户名下编译gcc
    Using python to process Big Data
    23 October
  • 原文地址:https://www.cnblogs.com/ping2yingshi/p/14066225.html
Copyright © 2011-2022 走看看