原題描述:
在一個排序數組中找一個數,返回該數出現的任意位置,如果不存在,返回-1
樣例
給出數組 [1, 2, 2, 4, 5, 5].
- 對於 target =
2, 返回 1 或者 2. - 對於 target =
5, 返回 4 或者 5. - 對於 target =
6, 返回 -1.
挑戰:
O(logn) 的時間
鏈接:
http://www.lintcode.com/zh-cn/problem/classical-binary-search/
題目分析:
1.給出一個有序數組以及一個目標值target,
2.要求返回target在數組中的位置,若數組里不存在target,則返回-1。
套用經典的二分查找模板即可:
class Solution:
# @param {int[]} A an integer array sorted in ascending order
# @param {int} target an integer
# @return {int} an integer
def findPosition(self, A, target):
# Write your code here
begin = 0
end = len(A)-1
n = len(A)
if n == 0:
return -1
while begin < end:
mid = begin + (end-begin)/2
if A[mid] == target:
return mid
elif A[mid] < target:
begin = mid + 1
end = end
continue
else:
end = mid - 1
begin = begin
continue
if A[begin] == target:
return begin
if A[end] == target:
return end
return -1
題目進階:
1.給定一個排序的整數數組(升序)和一個要查找的整數target,
2.用O(logn)的時間查找到target第一次出現的下標(從0開始),
3.如果target不存在於數組中,返回-1。
題目分析:
經典問題中返回為target的任意位置,此題變化為要求返回列表中的第一個位置;
沿用經典方案,查找到target的任一位置之后,索引自減,直至target不等於索引值;
返回索引+1即可。
class Solution:
# @param {int[]} A an integer array sorted in ascending order
# @param {int} target an integer
# @return {int} an integer
def binarySearch(self, A, target):
# Write your code here
begin = 0
end = len(A)-1
n = len(A)
if n == 0:
return -1
while begin < end:
mid = begin + (end - begin)/2
if A[mid] == target:
while A[mid] == target:
mid = mid - 1
return mid + 1
elif A[mid] < target:
begin = mid + 1
end = end
continue
else:
end = mid - 1
begin = begin
continue
if A[begin] == target:
return begin
if A[end] == target:
return end
return -1
PS:
如果是最后一個位置,索引自增,返回所以-1~
