lintcode: search for a range 搜索区间
题目
搜索区间
给定一个包含 n 个整数的排序数组,找出给定目标值 target 的起始和结束位置。
如果目标值不在数组中,则返回[-1, -1]
给出[5, 7, 7, 8, 8, 10]
和目标值target=8
,
返回[3, 4]
时间复杂度 O(log n)
解题
正常解法是二分法分别找左右边界的,时间复杂度O(logN),但是要注意边界,边界很多种情况的。
找左边界:
1.起始位置是0的单独考虑:nums[0] == target return 0
2.正常的二分查找思想
- while(left <= right){
- int median = (left + right)/2;
- if(nums[median] < target){
- left = median+1;
- }else if(nums[median]>target){
- right = median -1;
- }else if(nums[median]==target){
- if(nums[median-1]!=target)
- return median;
- else
- right = median - 1;
- }
- }
找右边界:
1.结束位置单独考虑:nums[right] == target return right
2.正常的二分查找思想
- while(left <= right){
- int median = (left + right)/2;
- if(nums[median] < target){
- left = median+1;
- }else if(nums[median]>target){
- right = median -1;
- }else if(nums[median]==target){
- if(nums[median+1]!=target)
- return median;
- else
- left = median + 1;
- }
- }
Java
- public class Solution {
- /**
- *@param A : an integer sorted array
- *@param target : an integer to be inserted
- *return : a list of length 2, [index1, index2]
- */
- public int[] searchRange(int[] A, int target) {
- // write your code here
- int[] res = {-1,-1};
- int len = A.length;
- if(len == 0 || A == null)
- return res;
- res[0] = BinaryLeft(A,0,len-1,target);
- res[1] = BinaryRight(A,0,len-1,target);
- return res;
- }
- public int BinaryLeft(int[] nums,int left,int right,int target){
- if(nums[0] == target)
- return 0;
- while(left <= right){
- int median = (left + right)/2;
- if(nums[median] < target){
- left = median+1;
- }else if(nums[median]>target){
- right = median -1;
- }else if(nums[median]==target){
- if(nums[median-1]!=target)
- return median;
- else
- right = median - 1;
- }
- }
- return -1;
- }
- public int BinaryRight(int[] nums,int left,int right,int target){
- if(nums[right] == target)
- return right;
- while(left <= right){
- int median = (left + right)/2;
- if(nums[median] < target){
- left = median+1;
- }else if(nums[median]>target){
- right = median -1;
- }else if(nums[median]==target){
- if(nums[median+1]!=target)
- return median;
- else
- left = median + 1;
- }
- }
- return -1;
- }
- }
Java Code
Python
- class Solution:
- """
- @param A : a list of integers
- @param target : an integer to be searched
- @return : a list of length 2, [index1, index2]
- """
- def searchRange(self, A, target):
- # write your code here
- res = [-1,-1]
- if A==None or len(A) == 0:
- return res
- res[0] = self.BoundaryLeft(A,0,len(A)-1,target)
- res[1] = self.BoundaryRight(A,0,len(A)-1,target)
- return res
- def BoundaryLeft(self,A,left,right,target):
- if A[0] == target:
- return 0
- while left<= right:
- median = (left + right)/2
- if A[median] < target:
- left = median + 1
- elif A[median] > target:
- right = median -1
- elif A[median] == target:
- if A[median-1]!=target:
- return median
- else:
- right = median -1
- return -1
- def BoundaryRight(self,A,left,right,target):
- if A[right] == target:
- return right
- while left<= right:
- median = (left+ right)/2
- if A[median] < target:
- left = median + 1
- elif A[median] > target:
- right = median - 1
- elif A[median] == target:
- if A[median + 1]!=target:
- return median
- else:
- left = median + 1
- return -1
Python Code
lintcode: search for a range 搜索区间的更多相关文章
- [LeetCode] 34. Search for a Range 搜索一个范围(Find First and Last Position of Element in Sorted Array)
原题目:Search for a Range, 现在题目改为: 34. Find First and Last Position of Element in Sorted Array Given an ...
- [LeetCode] Search for a Range 搜索一个范围
Given a sorted array of integers, find the starting and ending position of a given target value. You ...
- LintCode Search For a Range (Binary Search)
Binary Search模板: mid 和 target 指针比较,left/ right 和 target 比较. 循环终止条件: 最后剩两数比较(while(left + 1 < righ ...
- LeetCode OJ:Search for a Range(区间查找)
Given a sorted array of integers, find the starting and ending position of a given target value. You ...
- lintcode: 二叉查找树中搜索区间
题目 二叉查找树中搜索区间 给定两个值 k1 和 k2(k1 < k2)和一个二叉查找树的根节点.找到树中所有值在 k1 到 k2 范围内的节点.即打印所有x (k1 <= x <= ...
- lintcode-11-二叉查找树中搜索区间
二叉查找树中搜索区间 给定两个值 k1 和 k2(k1 < k2)和一个二叉查找树的根节点.找到树中所有值在 k1 到 k2 范围内的节点.即打印所有x (k1 <= x <= k2 ...
- [OJ] Search for a Range
LintCode 61. Search for a Range (Medium) LeetCode 34. Search for a Range (Medium) class Solution { p ...
- LeetCode解题报告—— Search in Rotated Sorted Array & Search for a Range & Valid Sudoku
1. Search in Rotated Sorted Array Suppose an array sorted in ascending order is rotated(轮流,循环) at so ...
- Add Digits, Maximum Depth of BinaryTree, Search for a Range, Single Number,Find the Difference
最近做的题记录下. 258. Add Digits Given a non-negative integer num, repeatedly add all its digits until the ...
随机推荐
- 鼠标悬浮图片时弹出透明提示图层的jQuery特效
源码: <!doctype html> <html class="no-js" lang="en"> <head> < ...
- Andriod docs加载速度慢的问题解决
网上找了个类, import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import ja ...
- BI与大数据
微博的诞生.云计算.物联网.移动互联网等各种爆炸式数据,给商业智能的蓬勃发展提供了良好的“大数据”环境.大数据为BI带来了海量数据.对挖掘来说,大数据量要更容易对比.抢夺大数据市场,需要具备一定的实力 ...
- tcp-client-c++
#include "stdafx.h" #include <Winsock2.h> #include <iostream> #pragma comment( ...
- NOIP2015-stone(二分答案)
这道题在考试时二分答案写炸了,结果得了20分.....同学有用贪心写的(对,贪心!!)都得了30,我感到了深深的恶意.这段时间在忙转语言,现在重新整理一下NOIP的题. 题目来源:vijos 题目如下 ...
- 【个人笔记】003-PHP基础-01-PHP快速入门-03-PHP环境搭建
003-PHP基础-01-PHP快速入门 03-PHP环境搭建 1.客户端(浏览器) IE FireFox CHROME Opera Safari 2.服务器 是运行网站的基本 是放置程序代码的地方 ...
- NodeJS - Express 3.0下ejs模板使用 partial展现 片段视图
如果你也在看Node.js开发指南,如果你也在一步一步实现 microBlog 项目!也许你会遇到本文提到的问题,如果你用的是Express 3.0 本书实例背景是 Express 2.0 而如今升级 ...
- oracle中操作数据
使用特定格式插入日期值 insert into emp values (,', to_date('1988-11-11','yyyy-mm-dd'), ); ,); 使用子查询插入数据 create ...
- MySQL、SqlServer、Oracle三大主流数据库分页查询
在这里主要讲解一下MySQL.SQLServer2000(及SQLServer2005)和ORCALE三种数据库实现分页查询的方法.可能会有人说这些网上都有,但我的主要目的是把这些知识通过我实际的应用 ...
- .NET核心代码保护策略-隐藏核心程序集
经过之前那个道德指责风波过后也有一段时间没写博客了,当然不是我心怀内疚才这么久不写,纯粹是程序员的通病..怎一个懒字了得,本来想写一些长篇大论反讽一下那些道德高人的.想想还是算了,那样估计会引来新一波 ...