力扣刷满100题,第一周

力扣刷满100题,第一周


1. 两数之和

  • 描述

    • 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标
  • 输入示例

    输入:nums = [2,7,11,15], target = 9
    输出:[0,1]
    解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]

  • 算法思想

      1. 首先从数组中选取一个元素nums[i],计算出目标值
      1. 遍历剩余的数组,比较目标值是否相同
        • 方法一:暴力思想,直接遍历,比较目标值
        • 方法二:哈希思想,创建一个空的字典,遍历的过程中,看目标值res是否在字典中,如果在则返回对应数值的下标;不在则添加**nums[i]**到字典中
        • 方法三:二分法,首先需要数组中的元素有序,可以使用ZIP方法生成一个带有下标的二维数组集,然后进行排序。
        • 方法四:index方法,在求出目标值后,判断目标值是否在数组中存在,存在则通过**index(res)**获取目标值的下标
      1. 返回数组中两个数的下标
  • 具体实现

    • 方法一:暴力思想
    class Solution:
        def twoSum(self, nums: List[int], target: int) -> List[int]:
            n = len(nums)
            for i in range(n):
                res = target - nums[i]
                for j in range(i + 1, n):
                    if res == nums[j]:
                        return i, j
            return []
    
    • 方法二:哈希思想
    class Solution:
        def twoSum(self, nums: List[int], target: int) -> List[int]:
            # 创建map
            mp = {}
            for i in range(len(nums)):
                res = target - nums[i]
                if res in mp:
                    return mp[res], i
                # 将数据存放到map
                mp[nums[i]] = i
            return []
    
    • 方法三:二分法
    class Solution:
        def twoSum(self, nums: List[int], target: int) -> List[int]:
            n = len(nums)
            # 带有数组下标排序后的二维数组
            data = sorted(zip(nums, range(n)))
            left, right = 0, n - 1
            while left < right:
                if data[left][0] + data[right][0] == target:
                    return data[left][1], data[right][1]
                elif data[left][0] + data[right][0] > target:
                    right -= 1
                else:
                    left += 1
            return []
    
    • 方法四:index方法
    class Solution:
        def twoSum(self, nums: List[int], target: int) -> List[int]:
            n = len(nums)
            for i in range(n):
                res = target - nums[i]
                # 判断目标值是否存在数组中
                if res in nums[i + 1 :]:
                    return i, nums[i + 1 :].index(res) + i + 1
    

2. 字母异位词分组

  • 描述

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

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

  • 输入示例

    输入:strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]

    输出:[[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]

  • 算法思想

    • 方法一:哈希思想

      • 首先构建一个空的字典
      • strs数组中的每个word排序,看字典中有无该类别
      • 如果有该类别,则将**strs[i]**存入该类别中
        • 如果没有,则将排序好的word存入字典中
      • 将字典的values转换为list集合形式返回
    • 方法二:大佬思想

  • 注意事项

    • 键不存在的时候需要将word转为数组即***[word]***,然后再放入到字典中
    • 最后需要获取字典的值,并转为list数组形式返回
  • 具体实现

    • 方法一:哈希思想
    class Solution:
        def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
            # 定义一个字典,用于存储字母异位词分组结果   anagram ->相同字母异序词
            anagram_dict = {}
            # 遍历所有单词
            for word in strs:
                # 将单词按照字母顺序排序,并作为键
                sorted_word = ''.join(sorted(word))
                # 如果该键已经在字典中,将当前单词加入到对应的列表中
                if sorted_word in anagram_dict:
                    anagram_dict[sorted_word].append(word)
                else:
                    # 如果该键不存在,则创建新的列表,并将当前单词加入其中
                    anagram_dict[sorted_word] = [word]
            # 返回字典中所有值组成的列表,即为结果
            return list(anagram_dict.values())
    
    • 方法二:大佬思想
    class Solution:
        def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
            """
            生成str的哈希值,由str中每个字符和出现的次数拼接而成。
            如字符串str="abcaba"的哈希值为"a3b2c1"
            """
            def get_str_hash(s: str) -> str:
                # 统计str中出现的字符次数
                counts = [0] * 26
                for ch in s:
                    counts[ord(ch) - ord('a')] += 1
                # 生成字符串的哈希字符串
                h = ""
                for i, c in enumerate(counts):
                    if c > 0:
                        h += f"{chr(ord('a') + i)}{c}"      # 加入字符和字符数量
                return h
    
            groups = {}     # 存放字符串哈希值和对应的字符串列表
            # 根据字符串的哈希值进行分组
            for s in strs:
                hash_str = get_str_hash(s)  # 获取字符串的哈希值
                if hash_str not in groups:
                    groups[hash_str] = []   # 哈希值不存在,为这个哈希值新建一个列表
                groups[hash_str].append(s)  # 将当前字符串加入hash对应的列表中
    
            return list(groups.values())    # 分组结果已存在哈希表中,返回所有值组成的列表
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值