3. 无重复字符的最长字串
题目链接:3. 无重复字符的最长子串
思路:滑动窗口。建一个窗口(list),如果字符串中的元素不在窗口中,就添加到窗口,如果存在,就删除窗口中包含此元素之前的元素,再把元素添加到窗口里。在遍历过程中,更新子字符串的长度,最后返回最大值。
class Solution(object):
def lengthOfLongestSubstring(self, s):
window = []
ans = 0
for letter in s:
if letter not in window: # 对于每个新加入的字符看它是否在滑动窗口中
window.append(letter)
else:
idx = window.index(letter)
for i in range(idx+1): # 每次删除idx+1次窗口的第一个元素,就能把原window idx前的元素全部移除。
del window[0]
window.append(letter)
if len(window) > ans:
ans = len(window)
return ans
46. 全排列
之前代码随想录中的回溯篇有刷到过。代码随想录算法训练营第三十一天(回溯算法篇)|491. 非递减子序列, 46. 全排列,47. 全排列Ⅱ-优快云博客
- 全排列需要用uset数组来去重。
- 注意是result.append(path[:]),不能只append path。
class Solution(object):
def backtracking(self, nums, path, result,uset):
if len(path) == len(nums):
result.append(path[:])
for i in range(len(nums)):
if uset[i] == 0:
path.append(nums[i])
uset[i] = 1
self.backtracking(nums, path, result, uset)
uset[i] = 0
path.pop()
def permute(self, nums):
path, result = [], []
uset = [0]*len(nums)
self.backtracking(nums, path, result, uset)
return result
475. 供暖器
思路:二分查找。对每个house求离它最近的heater的距离,所有距离的最大值即半径的最小值。
可以用到bisect_right函数:
bisect_right(list, x)
# 返回list中大于x的第一个下标值
class Solution(object):
def findRadius(self, houses, heaters):
ans = 0
heaters.sort()
for house in houses:
rightIdx = bisect_right(heaters, house)
leftIdx = rightIdx - 1
rightDis = heaters[rightIdx] - house if rightIdx < len(heaters) else float('inf')
# 如果heaters中的最大值也小于house的位置,说明此house在所有heaters的邮编,那么相当于它离右边的heater距离为无穷大(因为不存在)
leftDis = house - heaters[leftIdx] if leftIdx >= 0 else float('inf')
# 注意要加“=0”的情况,当rightDis为1,说明house的位置在idx为0和1的heaters中间,依然有leftDis
r = min(rightDis, leftDis)
ans = max(r, ans)
return ans