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

leetcode34 Find First and Last Position of Element in Sorted Array

Posted by BY on August 23, 2019

前言

一个多月没有更新了。

正文

问题来源

本问题来自leetcode上的34题。

问题描述

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 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]

分析:

这道题不能用go来提交

func searchRange(nums []int, target int) []int {
    res := make([]int, 2)
    res[0], res[1] = -1, -1
    if len(nums) == 0 || nums[0] > target || nums[len(nums)-1] < target {
        return res
    }
    l := 0; r := len(nums) -1
    for l <= r {
        mid := (l+r) / 2
        if nums[mid] > target {
            r = mid - 1
        } else if nums[mid] < target {
            l = mid + 1
        } else {
            i := mid
            for ; i >= 0 && nums[i] == target ; i-- {
            }
            res[0] = i + 1
            i = mid
            for ; i < len(nums) && nums[i] == target; i++ {
            }
            res[1] = i - 1
            return res
        }
    }
    return res
}

别人的代码

public class Solution {
    public int[] searchRange(int[] nums, int target) {
        int[] result = {-1, -1};
        int index = searchRightIndex(nums, 0, nums.length - 1, target);
        if (index < 0 || nums[index] != target)
            return result;
        result[0] = searchLeftIndex(nums, 0, index, target);
        result[1] = index;
        return result;
    }
    public int searchRightIndex(int[] nums, int left, int right, int target) {
        while (left <= right) {
            int mid = (left + right) / 2;
            if (nums[mid] > target) right = mid - 1;
            else left = mid + 1;
        }
        return right;
    }
    public int searchLeftIndex(int[] nums, int left, int right, int target) {
        while (left <= right) {
            int mid = (left + right) / 2;
            if (nums[mid] < target) left = mid + 1;
            else right = mid - 1;
        }
        return left;
    }
}

递归实现

public class Solution {
    public int[] searchRange(int[] nums, int target) {
        int[] res = new int[2];
        res[0] = bSearchLeft(nums, target, 0, nums.length-1);
        res[1] = bSearchRight(nums, target, 0, nums.length-1);
        return res;
    }
    private int bSearchLeft(int[] nums, int target, int left, int right) {
        if(left > right) return (left < nums.length && nums[left] == target) ? left : -1;
        int mid = (left + right) / 2;
        if(nums[mid] < target) return bSearchLeft(nums, target, mid+1, right);
        else return bSearchLeft(nums, target, left, mid - 1);
    }
    private int bSearchRight(int[] nums, int target, int left, int right) {
        if(left > right) return (right >= 0 && nums[right] == target) ? right : -1;
        int mid = (left + right) / 2;
        if(nums[mid] > target) return bSearchRight(nums, target, left, mid-1);
        else return bSearchRight(nums, target, mid+1, right);
    }
}

总结:

勤思考。

结语

不管怎么样好好加油。