查詢最近數問題 Python

2021-08-20 06:08:22 字數 2150 閱讀 1862

給定乙個已排序的整數陣列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 ...