Leetcode —— 34. 在排序数组中查找元素的第一个和最后一个位置(Java)

题目描述

        给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

        如果数组中不存在目标值 target,返回 [-1, -1]。

示例

Leetcode —— 34. 在排序数组中查找元素的第一个和最后一个位置(Java)_第1张图片

题解

        双指针与二分法。

双指针解法

代码

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int len = nums.length;
        int i = 0;
        int j = len - 1;
        // 前后两指针同时逼近
        while((i <= j) && (nums[i] != target || nums[j] != target)) {
            if (nums[j] > target) {
                j--;
            }
            if (nums[i] < target) {
                i++;
            }
        }

        int[] res = new int[2];
        if (i > j) {
            res[0] = -1;
            res[1] = -1;
            return res;
        }
        res[0] = i;
        res[1] = j;
        return res;
    }
}

性能

Leetcode —— 34. 在排序数组中查找元素的第一个和最后一个位置(Java)_第2张图片

二分法解法

代码

    class Solution {
        public int[] searchRange(int[] nums, int target) {
           int[] res = new int[]{-1, -1};
           int len = nums.length;
           if (len == 0) {
               return res;
           }
           int i = 0;
           int j = len - 1;
           int mid = 0;
           while(i <= j) {
               mid = (i + j) / 2;
               if (nums[mid] < target) {
                   i = mid + 1;
               }
               if (nums[mid] > target) {
                   j = mid - 1;
               }
               if (nums[mid] == target) {
                   break;
               }
           }
            if (nums[mid] != target) {
                return res;
            }
            int start = mid;
            int end = mid;

            // 这里同时向前后扩展,寻找第一个和最后一个元素。注意判断下标的合法性
            while (((start - 1) >= 0 && nums[start - 1] == target) || (( end + 1) < len && nums[end +1] == target)) {
                if ((start - 1) >= 0 && nums[start - 1] == target) {
                    start--;
                }
                if (( end + 1) < len && nums[end +1] == target) {
                    end++;
                }
            }
            res[0] = start;
            res[1] = end;
            return res;
        }
}

性能

Leetcode —— 34. 在排序数组中查找元素的第一个和最后一个位置(Java)_第3张图片

注意点

    基础题,注意边界即可。

你可能感兴趣的:(Java,LeetCode,二分法,指针,leetcode,数据结构,字符串)