记学习算法中一点小事
最近在刷Leetcode中的算法题,今天刷Tag二分查找的这一小类,一天陆陆续续把简单的刷到最后一题,当时已经下午四点了,脑袋昏的要死,发现算法这东西真的需要状态好的时候来搞,这个题目思路是有,但是到实现的时候总差了一点,就那么一点就是没搞清,但是我这个人又不是能藏得住事情的人(城府需要修炼啊),在回家的地铁上更是脑壳都要炸了,越想不通越放不下,回家休息了以后,脑袋清醒了点,思路突然就清晰了,我擦擦咧!不管如何把,确实好有意思,比cv程序员好玩多了!
其中可以用二分或者双指针,真的感觉到了算法之美,程序中的算法需要易读、高效、简洁。时间复杂度、空间复杂度、可读性、都是美的指标。
这条路充满了惊喜也许算法是最接近所谓的“道”的一种“术”
原题如下:
https://leetcode-cn.com/problems/heaters/submissions/
这里就不说题目了,虽然只是千百个关卡的一个,但是觉得值得纪念下,对比下
垃圾代码:(刚开始的脑袋昏昏的时候)
import math
class Solution2:
def findNearBy(self, n, heaters):
if n <= heaters[0]:
return heaters[0]
elif n >= heaters[-1]:
return heaters[-1]
length = len(heaters)
start = 0
end = length - 1
middle = math.floor((start + end) / 2)
while (heaters[middle] <= n <= heaters[middle + 1]) is False:
print(middle, heaters[middle], heaters[middle + 1], n)
if heaters[middle] > n:
end = middle
else:
start = middle
middle = math.floor((start + end) / 2)
if n - heaters[middle] < heaters[middle + 1] - n:
return heaters[middle]
else:
return heaters[middle + 1]
def findRadius(self, houses, heaters) -> int:
heaters.sort()
helper = []
for house in houses:
distance = abs(self.findNearBy(house, heaters) - house)
helper.append(distance)
return max(helper)
不那么垃圾的代码:
class Solution:
def findRadius(self, houses, heaters):
houses.sort()
heaters.sort()
len_house = len(houses)
len_heaters = len(heaters)
i = 0
j = 0
ans = 0 # 最小距离
while i < len_house and j < len_heaters:
if houses[i] <= heaters[j]:
ans = max(ans, heaters[j] - houses[i])
i += 1
else:
if j == len_heaters - 1:
ans = max(ans, houses[i] - heaters[j])
i += 1
else:
if heaters[j] < houses[i] <= heaters[j + 1]:
ans = max(ans, min(houses[i] - heaters[j], heaters[j + 1] - houses[i]))
i += 1
else:
j += 1
return ans
自我感觉:
这辈子也成不了大师了,但是就像那句话:怕什么真理无穷,进一寸有进一寸的欢喜!
