leetcode_hot_1-5

Ryder 2024-8-19 19 8/19

1.两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

'''
1.创建一个哈希表
2.遍历数组,值num[i]、索引i保存至哈希,继续下一轮,如出现补数值在哈希表,则返回补数值的相对应哈希键,于是[num_map[j],i]
'''
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        num_map = {}
        for i in range(len(nums)):
            j = target - nums[i]
            if j in num_map:
                return [num_map[j], i]
            num_map[nums[i]] = i
if __name__ == "__main__":
    # 测试用例
    solution = Solution()
    nums = [2, 7, 11, 15]
    target = 9
    print(solution.twoSum(nums, target))

2.字母异位词分组

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

'''
题解:
1.创建一个字典result,遍历列表,对每个列表内字母进行排序组合,结果保存为key
2.判断key是否在字典中,若不在则创建空列表,在的话就把value保存到该字典中,以键值对的方式。
3.以列表方式返回所有键值对,字典的 values() 方法会返回所有值的视图,转成列表后就是分组好的二维列表。
'''

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        result = {}
        for s in strs:
            key = ''.join(sorted(s))
            if key not in result:
                result[key] = []
            result[key].append(s)
        return list(result.values())

if __name__ == '__main__':
    solution = Solution()
    strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
    print(solution.groupAnagrams(strs))

3.最长连续序列

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

'''
题解:
1.数组集合去重
2.集合遍历,判断num是不是第一个连续数字,是的话继续循环number+1是否在集合中,不在则退出循环,取最大长度
'''
class Solution:
    def longestConsecutive(self, nums: List[int]) -> int:
        if not nums:
            return 0
        setnum = set(nums)
        max_length = 0
        for num in setnum:
            if num-1 not in setnum:
                length = 1
                number = num
                while(number+1 in setnum):
                    number += 1
                    length += 1
                max_length = max(max_length, length)
        return max_length


if __name__ == '__main__':
    solution = Solution()
    nums = [100, 4, 200, 1, 3, 2]
    print(solution.longestConsecutive(nums))

4.移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。

'''
题解:
1.判断nums非0
2.两个指针i、j,遍历数组,若i指针的值不为0,则i、j交换,j往后加1,最后结果为0的都在末尾
'''

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        if not nums:
            return 0
        j = 0
        for i in range(len(nums)):
            if nums[i]:
                nums[i], nums[j] = nums[j], nums[i]
                j = j + 1
        return nums

if __name__ == '__main__':
    solution = Solution()
    nums = [0, 1, 0, 3, 12]
    print("移动零之前:", nums)
    print("移动零之后:", solution.moveZeroes(nums))

5.盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。

题解:
1.底 right-left, 高 min(height_left, height_right)
2.area = (right-left)*min(height_left, height_right)
3.其中指针height[left]<height[right]时,可跳过,为left+1,反之right-1
'''
class Solution:
    def maxArea(self, height: List[int]) -> int:
       left = 0
       right = len(height) - 1
       max_area = 0
       while left < right:
           area = min(height[left], height[right])*(right - left)
           max_area = max(area, max_area)
           if height[left] < height[right]:
               left = left + 1
           else:
               right = right - 1

       return max_area

 

- THE END -

Ryder

12月30日17:36

最后修改:2025年12月30日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论