LeetCode刷题系列—34. Find First and Last Position of Element in Sorted Array

1.题目描述

英文版:

Given an array of integers nums sorted in ascending order,

find the starting and ending position of a given target value.

Your algorithm's runtime complexity must be in the order of O(log n).

If the target is not found in the array, return [-1, -1].

Example 1:

Input: nums = [5,7,7,8,8,10], target = 8

Output: [3,4]

Example 2:

Input: nums = [5,7,7,8,8,10], target = 6

Output: [-1,-1]

中文版:

有一个按序升序的整型数组,

寻找第一个和最后一个出现的目标值的位置。

算法的时间复杂度必须是O(log n).

在数组中如果没找到则返回[-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]

2.解法

2.1 解法1

思路:

这道题目为二分查找的变型题。这里分别用两次循环找出第一个等于target的数的位置和最后一个等于target的数的位置。

1)等于的时候,如果当前为第一个元素或者当前元素的前一个元素不等于target,则当前元素第一个等于target的数,否则继续往前找。

2)等于的时候,当前为最后一个元素或者当前元素的后一个元素不等于target,则当前元素最后一个等于target的数,否则继续往后找。

    public static int[] searchRange(int[] nums, int target) {
        int result[] = {-1,-1};
        int left = 0;
        int right = nums.length - 1;
        while (left <= right){  //寻找第一个等于target的数
            int middle = left + (right - left) / 2;
            if(target > nums[middle]){
                left = middle + 1;
            }else if(target < nums[middle]){
                right = middle - 1;
            }else { //等于的时候
                //如果当前为第一个元素或者当前元素的前一个元素不等于target
                //则当前元素第一个等于target的数
                //否则继续往前找
                if(middle == 0 || nums[middle-1] != target){
                    result[0] = middle;
                    break;
                }else{
                    right = middle - 1;
                }
            }
        }

        right = nums.length - 1;
        while (left <= right){  //寻找最后个等于target的数
            int middle = left + (right - left) / 2;
            if(target > nums[middle]){
                left = middle + 1;
            }else if(target < nums[middle]){
                right = middle - 1;
            }else { //等于的时候
                //如果当前为最后一个元素或者当前元素的后一个元素不等于target
                //则当前元素最后一个等于target的数
                //否则继续往后找
                if (middle == nums.length - 1 || nums[middle + 1] != target){
                    result[1] = middle;
                    break;
                }else {
                    left = middle + 1;
                }
            }
        }
        return result;
    }

在LeetCode上运行的结果:

3.测试

在本地,我只是简单写了一个main函数来对它进行测试。但是这些代码都是在LeetCode上运行通过了的。

    public static void main(String[] args) {
        int[] nums = {5,7,7,8,8,10};
        int target = 8;
        int[] result = searchRange(nums,target);
        Arrays.stream(result).forEach(System.out::println);
    }
欢迎关注个人公众号,可直接扫描以下二维码或微信搜索“阿毛聊技术”。

posted @ 2020-02-24 21:20  limaodeng  阅读(88)  评论(0)    收藏  举报