leetcode刷题笔记

LeetCode刷题思路与解法笔记

1两数之和

题目地址
给个数组和目标,求数组中那两个数可以组成目标
一般都想到两个for循环暴力解
标准答案给到一个hash表
通过将循环过的数字保存进去,这样可以智通过以此循环就能找到对应的两个数字

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        hashtable=dict()
        for i,num in enumerate(nums):
            if target-num in hashtable:
                return [hashtable[target-num],i]
            else:
                hashtable[nums[i]]=i

这里用到了

seasons = ['Spring', 'Summer', 'Fall', 'Winter']
list(enumerate(seasons))
>>> [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]

非常方便,相当于自动定义一个计数器了

3无重复最长子字符串

题目地址
设计了一个滑窗口,但是速度有点慢

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        max_len = 0
        left = 0
        seen = set()  # 记录当前窗口中的字符
        
        for right, char in enumerate(s):
            while char in seen:  # 如果字符重复,移动左指针
                seen.remove(s[left])
                print(seen)
                left += 1
            seen.add(char)  # 添加到窗口
            max_len = max(max_len, right - left + 1)  # 更新最大长度
        
        return max_len

思路:一个个看过来,有重复的就弹出第一个,然后记录最长的长度
但是我的代码比官方答案慢很多,原因是

seen.remove(s[left])

本身就是一个O(n),套在while in里面最坏就是O(n2)
官方答案中使用滑动窗口(双指针)保证每个字符最多被访问 2 次(左指针和右指针各一次)
以下是官方答案:

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        # 哈希集合,记录每个字符是否出现过
        occ = set()
        n = len(s)
        # 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
        rk, ans = -1, 0
        for i in range(n):
            if i != 0:
                # 左指针向右移动一格,移除一个字符
                occ.remove(s[i - 1])
            while rk + 1 < n and s[rk + 1] not in occ:
                # 不断地移动右指针
                occ.add(s[rk + 1])
                rk += 1
            # 第 i 到 rk 个字符是一个极长的无重复字符子串
            ans = max(ans, rk - i + 1)
        return ans

4寻找两个数组的中位数

题目地址
这个真是做不出来了,一点思路没有,遍历O(n+m)谁都想得出,但O(log(m+n)) 真想不出。直接看答案了
思路:运用二分查找,数组本身是有序的,通过下图找到中位线,最关键的就是如何通过二分法找到中位线,同时保证先左边的最大值小于线右边的最小值。不满足情况的条件下通过移动中位线取查找合适的位置。
中位线查找

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值