【LeetCode】No.34. Find First and Last Position of Element in Sorted Array -- Java

169 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天。

题目链接: leetcode.com/problems/fi…

1. 题目介绍(在排序数组中查找元素的第一个和最后一个位置)

Given an array of integers nums sorted in non-decreasing order, find the starting and ending position of a given target value.

【Translate】: 给定一个整数数组,nums按非递减顺序排序,找出给定目标值的起始和结束位置。

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

【Translate】: 如果target没有在数组中找到,则返回[-1,-1]。

You must write an algorithm with O(log n) runtime complexity.

【Translate】: 你必须写一个运行复杂度为O(log n)的算法。

【测试用例】:

test

【约束】:

Constraints

2. 题解

2.1 暴力穷举 -- O(n)

  无脑穷举,前一个,后一个,直接遍历,虽然很爽,但是不符合题目要求。

    public int[] searchRange(int[] nums, int target) {
        int[] res = {-1,-1};
        for (int i = 0; i < nums.length; i++)
        {
            if (nums[i] == target) 
            {
                res[0] = i;
                break;
            }
        }
        
        for (int i = nums.length-1; i >= 0; i--)
        {
            if (nums[i] == target) 
            {
                res[1] = i;
                break;
            }
            
        }
        return res;
    }

case

2.2 二分查找 -- O(logn)

  atwenbobu提供的题解 Easy java O(logn) solution ,应用了两次二分查找来找到目标元素的每个索引。可和上一题【LeetCode】No.33. Search in Rotated Sorted Array -- Java Version做一个参考。

    public int[] searchRange(int[] nums, int target) {
        int[] result = new int[2];
        result[0] = findFirst(nums, target);
        result[1] = findLast(nums, target);
        return result;
    }

    private int findFirst(int[] nums, int target){
        int idx = -1;
        int start = 0;
        int end = nums.length - 1;
        while(start <= end){
            int mid = (start + end) / 2;
            if(nums[mid] >= target){
                end = mid - 1;
            }else{
                start = mid + 1;
            }
            if(nums[mid] == target) idx = mid;
        }
        return idx;
    }

    private int findLast(int[] nums, int target){
        int idx = -1;
        int start = 0;
        int end = nums.length - 1;
        while(start <= end){
            int mid = (start + end) / 2;
            if(nums[mid] <= target){
                start = mid + 1;
            }else{
                end = mid - 1;
            }
            if(nums[mid] == target) idx = mid;
        }
        return idx;
    }

case2