leecode

本文主要探讨了LeetCode中的几个经典问题,包括旋转数组的搜索与旋转、深度优先搜索(DFS)解决岛屿问题、反转链表的操作,以及打家劫舍问题的动态规划解法。特别强调了在解决旋转数组问题时如何利用二分法优化时间复杂度,以及在DFS中处理边界条件和递归表达式的重要性。
摘要由CSDN通过智能技术生成

leecode128,最长连续子序列,哈希表枚举,要注意技巧,判断num-1是否在哈希表中,可以降低时间复杂度。

class Solution:
    def longestConsecutive(self, nums: List[int]) -> int:
        nums_set = set(nums)
        long_path = 0
        for num in nums_set:
            if num-1 not in nums_set:
                current_num = num
                current_path = 1
                while current_num + 1 in nums_set:
                    current_num += 1
                    current_path += 1
                long_path = max(long_path,current_path)
        return long_path

旋转数组

leecode33,搜索旋转数组,二分后两边子数组一个有序一个无序,在有序的那一边继续搜索。但是要考虑重复数字的存在。

class Solution:
    def search(self, nums,target: int) -> int:
        if len(nums) == 0:
            return -1
        if len(nums) == 1:
            if nums[0] == target:
                return 0
            else:
                return -1
        l = 0
        r = len(nums)
        while l < r:
            mid = (l+r)//2
            if nums[mid] == target:
                return mid

            if nums[l] == nums[mid] and nums[r-1] == nums[mid]:
                l += 1
                r -= 1
            elif nums[l]<=nums[mid]:
                if nums[l]<=target<=nums[mid]:
                    r = mid
                else:
                    l = mid + 1
            else:
                if nums[mid]<=target<=nums[r-1]:
                    l = mid + 1
                else:
                    r = mid
        return -1

leecode81,旋转数组,leecode38加强版,有重复数字,难以判断子数组哪个有序,所以碰到nums[l],nums[mid],nums[r-1]三数字相等时,l和r分别加减1

class Solution:
    def search(self, nums,target: int) -> int:
        if len(nums) == 0:
            return -1
        if len(nums) == 1:
            return nums[0] == target
        l = 0
        r = len(nums)
        while l < r:
            mid = (l+r)//2
            if nums[mid] == target:
                return True

            if nums[l] == nums[mid] and nums[r-1] == nums[mid]:
                l += 1
                r -= 1
            elif nums[l]<=nums[mid]:
                if nums[l]<=target<=nums[mid]:
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值