題目均採用python進行完成
已知供暖裝置和房屋的位置,給出供暖裝置的最小半徑
注意:供暖裝置需要排序
可以使用python中的bisect找到需要插入的索引值
from bisect import bisect
deffind_radius
(house, heater)
:# 供暖裝置排序
heater.sort(
) radius =
0# 每個房子尋找最小的供暖距離
for h in house:
index_h = bisect(heater, h)
left = heater[index_h-1]
if index_h -
1>=
0else
float
('-inf'
) right = heater[index_h]
if index_h <
len(heater)
else
float
('-inf'
) radius =
max(radius,
min(h - left, right - h)
)return radius
採用逼近的方法 == 二分查詢
def
sqrt
(x):
left, right =
0, x
while left <= right:
mid = left +
(right - left)//2
if(mid == x // mid)
:return mid
elif
(mid < x // mid)
: left = mid +
1else
: right = mid -
1return right
在乙個n*m的矩陣中,每一行都是排好的,每一列都是排好的,設計乙個演算法在矩陣中查詢乙個數
查詢最小的搜尋方向開始
def
matrix_search
(matrix, target)
:
row, col =
len(matrix)
,len
(matrix[-1
])left = matrix[row-1]
[0] point_left =
0 point_right = row-
1while point_left <= col and point_right >=0:
if target == left:
return
(point_right,point_left)
elif target > left:
point_left +=
1 left = matrix[point_right]
[point_left]
else
: point_right -=
1 left = matrix[point_right]
[point_left]
return(-
1,-1
)
在乙個n*m的矩陣裡,每一行和每一列都是排好序的,設定乙個演算法在矩陣中查詢第k小的數字。
思路:找到最小、最大和中間值
中間值在每一行進行二分比較,並求和
小於k,從說明 最小值太小
大於k, 最大值太大 需要重新逼近
from bisect import bisect
defksmall_search
(matrix, k)
:
left, right = matrix[0]
[0], matrix[-1
][-1
]while left < right:
mid = left +
(right - left)//2
ifsum
(bisect(row, mid)
for row in matrix)
< k:
left = mid +
1else
: right = mid
return left
採用二分搜尋的逼近的思想
def
find_duplicate
(num)
:
low =
1 high =
len(num)-1
while low < high:
mid = low +
(high - low)//2
count =
0for i in num:
if i <= mid:
count +=
1if count <= mid:
low = mid +
1else
: high = mid
return low
輸入[1,3],[2,6],[8,10]
輸出[1,6],[8,10]
先寫乙個建立區間的類
class
interval
:def
__init__
(self, s=
0, e=0)
: self.start = s
self.end = e
def__str__
(self)
:return
"["+ self.start +
","+ self.end +
"]"def
__repr__
(self)
:return
"[%s, %s]"
%(self.start, self.end)
再寫合併區間
三種情況, 完全包含, 沒有交叉, 有小部分交叉
討論情況與合併區間類似
def
insert
(interval, newinterval)
: merge =
for i in interval:
if newinterval is
none
or i.end < newinterval.start:
merge += i
elif i.start > newinterval.start:
merge += newinterval
merge += i
newinterval =
none
else
: newinterval.start =
min(i.start, newinterval.start)
newinterval.end =
max(i.end, newinterval.end)
if newinterval is
notnone
: merge += newinterval
return merge
每日程式設計題 03
所有題目實現都是採用python 在乙個m行n列的矩陣中,如果查詢到乙個元素為 0 將其所在的行和列的元素都設為 0 需要考慮乙個記錄矩陣,一般都會考慮m行n列的,但是可以行列分開考慮,這樣會減少空間複雜度,只需要 m n def myzero matrix m none len matrix n ...
每日程式設計題 06
所有題目還是採用python進行解答的哦!今天的題目相對來說比較簡單,也有很多種解決方法,我只是給出了一些方法,大家可以多多查查,希望一起交流學習。def forsolve n for迴圈 s 1if n 0 return 1else for i in range 1 n 1 s i return ...
每日程式設計題 10
所有題目均採用python進行完成 def binary search num,target 判斷是否為空 iflen num 0 return 1 left 0 right len num 1 while left 1 right mid left right 2 if num mid targe...