记学习算法中一点小事
最近在刷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
自我感觉:
这辈子也成不了大师了,但是就像那句话:怕什么真理无穷,进一寸有进一寸的欢喜!