【leetcode】34Search for a Range(二分搜索上下界)
2016-06-13 18:47
316 查看
题目大意:给出一排好序的整型数组,给定一个目标值,如果数组中有目标值,则要求返回目标值下标范围,例如:[5, 7, 7, 8, 8, 10],目标值为8,函数应当返回[3,4],如果数组中没有目标值,则返回[-1,-1],要求时间复杂度O(logn)
题目解法:数组有序显然会想到二分查找,二分查找不仅可以找到准确的值的位置也可以找到边界位置(如第一个大于等于某值或小于等于某值的位置),在本题中我们需要找到第一个等于目标值的位置以及最后一个等于目标值的位置,可以分两次分别查找
查找第一个等于目标值的位置:
每次将中点值与目标值比较,若小于目标值说明第一个目标值位置应在mid右边,left=mid+1,否则第一个目标值位置应在mid左边(不能排除mid),right=mid
其中求中间位置写成mid=left+(right-left)/2而不是mid=(left+right)/2是为了防止溢出
查找最后一个目标值的位置:
与前面的相似,将中点值与目标值比较,若大于目标值,则说明最后一个目标值在mid左边,right=mid-1,其他情况则说明最后一个目标值在mid右边(不能排除mid)left=mid
特别注意求中间位置要写成mid=left+(right-left+1)/2,这是因为当left+1=right时,若按照原有写法,无论中间位置的值与目标值是什么关系,都无法跳出循环,最终形成死循环
这道题总的代码如下
题目解法:数组有序显然会想到二分查找,二分查找不仅可以找到准确的值的位置也可以找到边界位置(如第一个大于等于某值或小于等于某值的位置),在本题中我们需要找到第一个等于目标值的位置以及最后一个等于目标值的位置,可以分两次分别查找
查找第一个等于目标值的位置:
每次将中点值与目标值比较,若小于目标值说明第一个目标值位置应在mid右边,left=mid+1,否则第一个目标值位置应在mid左边(不能排除mid),right=mid
其中求中间位置写成mid=left+(right-left)/2而不是mid=(left+right)/2是为了防止溢出
while(left<right) { mid=left+(right-left)/2; if(nums[mid]<target) left=mid+1; else right=mid; }
查找最后一个目标值的位置:
与前面的相似,将中点值与目标值比较,若大于目标值,则说明最后一个目标值在mid左边,right=mid-1,其他情况则说明最后一个目标值在mid右边(不能排除mid)left=mid
特别注意求中间位置要写成mid=left+(right-left+1)/2,这是因为当left+1=right时,若按照原有写法,无论中间位置的值与目标值是什么关系,都无法跳出循环,最终形成死循环
while(left<right) { mid=left+(right-left+1)/2; if(nums[mid]>target) right=mid-1; else left=mid; }
这道题总的代码如下
相关文章推荐
- leetcode 179 Largest Number
- leetcode 24 Swap Nodes in Pairs
- leetcode 2 Add Two Numbers 方法1
- leetcode 2 Add Two Numbers 方法2
- leetcode----Longest Substring Without Repeating Characters
- [LeetCode]47 Permutations II
- [LeetCode]65 Valid Number
- [LeetCode]123 Best Time to Buy and Sell Stock III
- [LeetCode] String Reorder Distance Apart
- [LeetCode] Sliding Window Maximum
- [LeetCode] Find the k-th Smallest Element in the Union of Two Sorted Arrays
- [LeetCode] Determine If Two Rectangles Overlap
- [LeetCode] A Distance Maximizing Problem
- leetcode_linearList
- leetcode_linearList02
- 快速排序里的学问:从猜数字开始
- 021-Merge Two Sorted Lists(合并两个排好序的单链表);leetcode
- LeetCode[Day 1] Two Sum 题解
- LeetCode[Day 2] Median of Two Sorted Arrays 题解
- LeetCode[Day 3] Longest Substring Without... 题解