算法练习|Leetcode49字母异位词分词 ,Leetcode128最长连续序列,Leetcode3无重复字符的最长子串,sql总结

一、Leetcode49字母异位词分词

题目描述

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

在这里插入图片描述

题目链接:力扣题目链接

解题思路

  • 看到小写字母,想到使用哈希ord
  • 将前面出现过的放在字典,再次出现相同的就append

方法:哈希

  • 要用两次循环做哈希,找到每个单层对应的哈希特征
  • 加入字典
  • 打印字典value
class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        mp = defaultdict(list)

        for i in strs:
            # 把每个单词特征存好
            pre = [0] * 26
            for j in i:
                pre[ord(j) - ord("a")] += 1
            # 找之前是否出现过
            mp[tuple(pre)].append(i)

        return list(mp.values())
           

总结

  • 新建字典:mp = defaultdict(list),添加value时默认值是[]
  • 字典的key要唯一,数组作为key要变成元组tuple
  • 最终输出字典的所有value:list(mp.values())


二、Leetcode128最长连续序列

题目描述

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

在这里插入图片描述

题目链接:力扣题目链接

解题思路

  • 去重
  • 排序
  • 看下一位是不是当前位+1
  • 更新最大长度

方法:

  • 先用list(set())去重,sort()排序
  • 看下一位是不是当前位+1
  • 更新最大长度
  • 反之,长度变回1
class Solution:
    def longestConsecutive(self, nums: List[int]) -> int:
        if not nums:
            return 0
            
        nums = list(set(nums))  # 去除重复元素
        nums.sort()
        l = 1
        res = 1
        for i in range(len(nums)):
            cur = nums[i] 
            if (i+1)<len(nums) and nums[i+1] == cur+1:
                l += 1
                res = max(res, l)
            else:
                l = 1

        return res
        

总结

  • 思考要不要排序,排序前要不要去重
  • 去除重复元素再排序!!list(set()),.sort()
  • 注意i+1不要超限!!


三、Leetcode3无重复字符的最长子串

题目描述

给定一个字符串 s ,请你找出其中不含有重复字符的 最长
子串的长度。

在这里插入图片描述

题目链接:力扣题目链接

解题思路

  • 双指针
  • 每走一步,用字典记录字符和下标
  • 出现重复的,移动left,更新right

方法:双指针法

  • 每走一步记录 字符:下标
  • 遇到重复的,left移动到之前记录的重复位置+1
  • 更新当前right位置的字典
  • 更新length
  • right += 1
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        left, right = 0, 0
        length = 0
        dic = {}
        while right < len(s):
            if s[right] in dic and dic[s[right]] >= left:
                left = dic[s[right]] + 1
            dic[s[right]] = right
            length = max(length, right - left + 1)
            right += 1

        return length
        

总结

  • left的移动:
    字典中先判断有重复元素
    并且重复元素之前出现的位置在left右边
    移动到重复元素的右边一个位置


sql总结

  • 所有情况都满足才返回
    (当一个产品所有发布时间都要在时间范围内才返回id)
    用count检测:having count(x between ’ ’ and ’ ') = count(*)

心得:积累算法还是要多刷题,在进步了!~

  • 32
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值