LeetCode刷题|3. 无重复字符的最长字串,46. 全排列,475. 供暖器

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值