坚持!
859. 亲密字符串
为节省页面,题目就省了。
看完自己的答案,发现和题解比起来显得稚嫩。
首先,稚嫩的思路是将不同的位置找出来,然后去两两调换位置,调换后进行对比。
时间复杂度O(n2)
其实有更简单的思路:
"""
如果是亲密字符串,就一定是两个调换位置。不能再多。
只要遍历一次,找出不一样元素,以一对关系的形式记录起来。
如果是两对关系,如果是亲密字符串,则第一对的关系一定是另一对的逆。
其他不符合条件 return False
例如:符合条件的一定会是:Xi == Yj 与 Xj == Yi (X(Y)是第(另)一个字符串的中某一 元素)
"""
class Solution:
def buddyStrings(self, a: str, b: str) -> bool:
a, b = list(a), list(b) # 准备后续迭代
if len(a)!=len(b): # 亲密字符串一定一样长
return False
if a == b: # 如果字符串相等,则要检查是否有重复元素,有的话是亲密字符串
if len(set(a)) == len(a): # 如果去重后没减少,则没有重复元素
return False
else:
return True
sign = []
for x,i in enumerate(a):
if i!=b[x]:
sign.append((i,b[x]))
if len(sign) == 2 and sign[0] == sign[1][::-1]: # 先判断是否2对,否则时而出错
return True
return False
875. 爱吃香蕉的珂珂
难度中等
终于是有一题能够凭借自己的代码写出来了(感觉)
这是一道二分法的题(将吃的速度看成是需要寻找的答案,进行搜索)
class Solution:
def minEatingSpeed(self, piles: List[int], h: int) -> int:
high = max(piles) # 由于她一定能吃完,所以时间给的不会比数组长度要小,当时间对应组数的时候,必须最大值才能吃完
low = sum(piles)//h # 尽可能大,可以不用满足吃得完的条件,题解这里是1。
# (或许这是题解基本都在300+~400ms的原因吧,这串代码能够达到200+ms来自菜鸡的自我满足)
if low == 0: # 如果给的时间足够多,low可能==0,会导致后边除数为0的情况。所以要改为1
low = 1
# 二分模板
while low < high:
given_speed = (low+high)//2
if self.caneatup(given_speed, h, piles):
high = given_speed
else:
low = given_speed+1
return low
def caneatup(self, given_speed, h, piles):
"""
判断能否吃完
"""
if sum([ceil(i/given_speed) for i in piles]) <= h:
return True
return False