打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
34 LintCode/LeetCode] Search for a Range [左右边界法/一次循环法]

Problem

Given a sorted array of n integers, find the starting and ending position of a given target value.

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

Example

Given [5, 7, 7, 8, 8, 10] and target value 8,
return [3, 4].

Challenge

O(log n) time.

Note

首先,建立二元结果数组res,起点start,终点end。
二分法求左边界:
当中点小于target,start移向中点,否则end移向中点;
先判断起点,再判断终点是否等于target,如果是,赋值给res[0]。
二分法求右边界:
当中点大于target,end移向中点,否则start移向中点;
先判断终点,再判断起点是否等于target,如果是,赋值给res[1]。
返回res。

Solution

public class Solution {    public int[] searchRange(int[] A, int target) {        int []res = {-1, -1};        if (A == null || A.length == 0) return res;        int start = 0, end = A.length - 1;        int mid;        while (start + 1 < end) {            mid = start + (end - start) / 2;            if (A[mid] < target) start = mid;            else end = mid;        }        if (A[start] == target) res[0] = start;        else if (A[end] == target) res[0] = end;        else return res;        start = 0;        end = A.length - 1;        while (start + 1 < end) {            mid = start + (end - start) / 2;            if (A[mid] > target) end = mid;            else start = mid;        }        if (A[end] == target) res[1] = end;        else if (A[start] == target) res[1] = start;        else return res;        return res;    }}

Another Binary Search Method

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
LeetCode 81. 搜索旋转排序数组 II
Leetcode611. 有效三角形的个数 Valid Triangle Number(Medium)
380,缺失的第一个正数(中)
聊一聊二分查找法
LeetCode 540.有序数组中的单一元素
二分查找算法详解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服