LeetCode----Search for a Range
来源:互联网 发布:淘宝图片拍摄 编辑:程序博客网 时间:2024/06/07 09:24
Search for a Range
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(logn)的时间复杂度,很容易想到是利用二分查找的方式。当然,一般形式的二分查找并不能满足这题的要求,要稍微进行一点改变。我的思路是进行两轮递归的二分查找,向左的递归查找给定target的最左边的起始的下标,向右的递归查找给定target的最右边的结束下标。当然,我还用了一轮二分查找先判断下给定的target是否存在,如果不存在则返回[-1, -1]。虽然代码的相似度很高,但是我并没有找到合适的办法让它满足DRY原则。
代码:
class Solution(object): def searchRange(self, nums, target): """ :type nums: List[int] :type target: int :rtype: List[int] """ left = 0 right = len(nums) - 1 if self.binarySearch(left, right, nums, target): m_left = self.find_L_Pos(left, right, nums, target) m_right = self.find_R_Pos(left, right, nums, target) return [m_left, m_right] else: return [-1, -1] def binarySearch(self, left, right, nums, target): while left <= right: mid = (left + right) / 2 if nums[mid] == target: return True elif nums[mid] > target: right = mid - 1 else: left = mid + 1 return False def find_L_Pos(self, left, right, nums, target): if left >= right: return left else: mid = (left + right) / 2 if nums[mid] == target: return self.find_L_Pos(left, mid, nums, target) elif nums[mid] > target: return self.find_L_Pos(left, mid - 1, nums, target) elif nums[mid] < target: return self.find_L_Pos(mid + 1, right, nums, target) def find_R_Pos(self, left, right, nums, target): if left >= right: return left else: mid = ((left + right) / 2) + 1 if nums[mid] == target: return self.find_R_Pos(mid, right, nums, target) elif nums[mid] > target: return self.find_R_Pos(left, mid - 1, nums, target) else: return self.find_R_Pos(mid + 1, right, nums, target)
----------------------------------------------------------------------------------------------------------------------------------------------
补充的分析:
在我再次看到这道题的时候,想到了一种新的思路。
题目要求在一个有序的数组中进行查找,要求是O(logn)的时间复杂度,那么肯定是要用二分查找的方式的。
而我上面的分别从左边和从右边进行查找target的下标的代码很是累赘,为什么我不能仅使用一次二分查找先找到target的位置,然后,使用双指针一个往前一个往后来确定target的具体的位置。这样子既能满足时间复杂度的要求,同时也能够减少很多冗余的代码。
具体来说,我们使用二分查找法找到target元素时,即mid位置指向target时,target的范围只可能在[left, right]之间,如果nums[left]值不等于target,那么left++继续向右检验,如果nums[right]值不等于target,那么right--继续向左检验。
class Solution(object): def searchRange(self, nums, target): """ :type nums: List[int] :type target: int :rtype: List[int] """ left, right = 0, len(nums) - 1 while nums[left] < nums[right]: mid = (left + right) / 2 if nums[mid] > target: right = mid - 1 elif nums[mid] < target: left = mid + 1 else: if nums[left] != target: left += 1 if nums[right] != target: right -= 1 if nums[left] != target and nums[right] != target: return [-1, -1] return [left, right]
- LeetCode: Search for a Range
- LeetCode Search for a Range
- [Leetcode] Search for a Range
- LeetCode : Search for a Range
- [LeetCode] Search for a Range
- [Leetcode] Search for a Range
- Leetcode Search for a Range
- [LeetCode]Search for a Range
- LeetCode-Search for a Range
- [leetcode] Search for a Range
- LeetCode - Search for a Range
- Search for a Range leetcode
- LeetCode | Search for a Range
- LeetCode - Search for a Range
- LeetCode: Search for a Range
- leetcode: Search for a Range
- 【leetcode】Search for a Range
- Leetcode: Search for a Range
- Python线程isAlive方法
- Linux程序设计-读书笔记2
- 安卓开发之自定义Dialog
- 2015-09-04
- xhprof
- LeetCode----Search for a Range
- CORS
- Python线程的线程名
- 【NOIP2014 Day1 T2】联合权值
- Python线程的daemon属性
- Effective C++——条款20,条款21(第4章)
- 修改本地mysql密码
- Python简单线程同步
- 常用技术