給定乙個已排序的整數陣列a,和乙個待查詢的目標值整數target。陣列a下標從0開始,元素可能有重複。要求返回陣列與target值相等或最相近的元素下標。任何異常情況,返回-1。(程式語言不限,時間複雜度要求為o(logn),同學去雲腦科技的面試題)
例如:a=[1, 2, 3], target=2, 輸出 [1]
a=[1, 4, 6], target=3, 輸出 [1]
a=[1, 4, 6], target=5, 輸出 [1, 2]
a=[1, 3, 3, 4], target=2, 輸出 [0, 1, 2]
# 面試題(同學的)2018-05-24 下午
# 解題思路:二分查詢,尋找最佳位置,如果存在返回索引mid,如果不存在返回應該插入的索引mid(保持有序)
# 如果 0 < mid < n: # 說明找到了或者沒找到,但是應該插入數列的內部,從最佳位置向兩邊查詢,找出所有的最近數字
# 如果 mid == 0: # 小於最左邊的數字,只向右查詢,找出所有的最近數字
# 如果 mid == n: # 大於最右邊的數字,只向左查詢,找出所有的最近數字
# 如果 陣列為空 返回 -1
def searchinsert(nums, target): # 二分查詢,如果找到,返回下標索引,沒有則返回應該插入的位置(保持有序)
start = 0
end = len(nums) - 1
while start <= end:
mid = (start + end) // 2
if nums[mid] == target:
return mid
elif nums[mid] < target:
start = mid + 1
else:
end = mid - 1
return end + 1
def rindex(nums, target):
n = len(nums)
if n == 0: return -1
mid = searchinsert(nums, target)
rlist = # 保持索引
i, j = -1, n
left, rigth = 0, 0 # 左右擴充套件的標誌
mxg = float('-inf')
if 0 < mid < n: # 如果找到了
i, j = mid-1, mid
mxg = min(abs(nums[i] - target), abs(nums[j] - target))
left, rigth = 1, 1
elif mid == 0: # 小於最左邊的數字
j = mid
mxg = abs(nums[j] - target)
left, rigth = 0, 1
elif mid == n: # 大於最右邊的數字
i = mid-1
mxg = abs(nums[i] - target)
left, rigth = 1, 0
while left == 1 or rigth == 1: # 兩邊查詢
if i == -1: left = 0
if j == n: rigth = 0
if left == 1 and i >= 0:
le = abs(nums[i] - target)
if le == mxg:
rlist = [i] + rlist
i -= 1
else:
left = 0
if rigth == 1 and j < len(nums):
ri = abs(nums[j] - target)
if mxg == ri:
rlist = rlist + [j]
j += 1
else:
rigth = 0
return rlist
if __name__ == '__main__':
nums, target = [1, 1, 2, 2, 4, 4], 3
print(rindex(nums, target))
最近遇到的mysql查詢的問題
1.每個使用者取一條最晚資料的mysql查詢方法 select from where in select max id from group by userid 2.刪除重複資料 只剩下一條 的方法 delete a from a left join select max id as id from...
最近遇到的幾個python問題彙總
python中的版本是乙個很重要的東西,因為低版本向高版本幾乎完全不相容,高版本向低版本也幾乎是不相容的樣子。不知道python開發團隊在想什麼,哈哈。在網上查詢的第乙個方式如下 python c import matplotlib print matplotlib.version tracebac...
最近點問題
求點集中的最近點對有以下兩種方法 設p1 x1,y1 p2 x2,y2 pn xn,yn 是平面上n個點構成的集合s,設計演算法找出集合s中距離最近的點對。1 蠻力法 適用於點的數目比較小的情況下 1 演算法描述 已知集合s中有n個點,一共可以組成n n 1 2對點對,蠻力法就是對這n n 1 2 ...