Search for a range寻找上下界-Leetcode
时间:2022-05-04
本文章向大家介绍Search for a range寻找上下界-Leetcode,主要内容包括原题如下:、思路如下:、left+right是有可能超出int上下界的!后果话美不看!、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
原题如下:
Given a sorted array of integers, 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]
.
For example,
Given [5, 7, 7, 8, 8, 10]
and target value 8,
return [3, 4]
.
思路如下:
很明显这是一道考察二分法的题目。我一开始的思路是利用二分找到该目标元素,然后向左右两侧递增和递减。但是这样它就不是O(log n)的复杂度了。
后来在别人的答案里看到一个非常巧妙的实现,利用了二分法的一点变化。传统的二分法采用如下结构:
1 int left=0;
2 int right=length-1;
3 int middle=(left+right)/2;
4 while(left<right){
5 if(middle>target){
6 right=middle-1;
7 }
8 else if(middle>target){
9 left=middle+1;
10 }
11 else{
12 return middle;
13 }
14 }
15 return left;
在这个题目中,我们不是要找到一个特定的元素,而是要找到这样一组元素的上下界。那就要对二分法进行修改。
不再是找到相等元素就跳出循环,而是找到相等元素就继续把边界向另一端推进,直到推进到相等元素的最后一个为止。
这样一来,我们只需运行两次方向不同的二分就可以找到上下界了。
代码如下:
1 public class Solution {
2 public int[] searchRange(int[] nums, int target) {
3 int left=0,right=nums.length;//注意 右边界不是取的nums.length-1。这是为了方便做第29行的判断.
4 int mid=(left+right)/2;
5 while(left<right){
6 if(nums[mid]>=target){
7 right=mid;
8 }
9 else{
10 left=mid+1;
11 }
12 mid=(left+right)/2;
13 }
14 int start=left;
15 left=start;
16 right=nums.length;
17 mid=(left+right)/2;
18 while(left<right){
19 if(nums[mid]>target){
20 right=mid;
21 }
22 else{
23 left=mid+1;
24 }
25 mid=(left+right)/2;
26 }
27 int end=right;
28 return (start==end)?new int[]{-1,-1}:new int[]{start,end-1};
29 }
30 }
关于二分法,还有重要的一个陷阱:
left+right是有可能超出int上下界的!后果话美不看!
- HDUOJ---The Moving Points
- HDUOJ---------Kia's Calculation
- HDUOJ----Good Numbers
- DP较为完整的知识
- HDUOJ----The Number Off of FFF
- HDUOJ-------Naive and Silly Muggles
- HDUOJ----A Computer Graphics Problem
- HDUOJ---(4708)Herding
- HDUOJ---(4708)Rotation Lock Puzzle
- HDUOJ---Hamming Distance(4712)
- HDUOJ-----Difference Between Primes
- HDUOJ----(4706)Children's Day
- poj-------Common Subsequence(poj 1458)
- poj----Maximum sum(poj 2479)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法