每日程式設計題 11

2021-10-25 15:32:50 字數 4222 閱讀 9254

題目均採用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...