leecode(2)

本文介绍了如何使用双指针技巧优化求解容器最多装水、三数之和及接雨水等问题的时间复杂度,从O(n^2)提升到O(n),展示了在IT技术中优化算法解决经典问题的方法。
摘要由CSDN通过智能技术生成

盛最多水的容器

在这里插入图片描述使用的是两次遍历,时间复杂度是O(n^2)

class Solution(object):
    def maxArea(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        max_volume=0
        for i in range(len(height)):
            for j in range(i+1,len(height)):
                volume=(j-i)*min(height[i],height[j])
                max_volume=max(volume,max_volume)
        return max_volume

使用双指针,一个从头,一个从尾,因为两指针i,j距离越大越好,i和j数组值小的那个向中间移动一格。时间复杂度就会只有O(n)

i,j=0,len(height)-1
        max_volume=0
        while i<j:
            volume=(j-i)*min(height[j],height[i])
            max_volume=max(max_volume,volume)
            if height[i]<=height[j]:
                i+=1
            else:
                j-=1
        return max_volume

15. 三数之和

在这里插入图片描述除了暴力解,可以用排序+双指针, k遍历数组,i=k+1,j=len(nums)-1,当和小于0说明i应该增大,和大于0说明j应该减小,时间复杂度为O(n^2)

class Solution(object):
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        nums.sort()
        l=len(nums)
        res=[]
        k=0
        for k in range(l-2):
            if nums[k]>0:
                break
            if k>0 and nums[k]==nums[k-1]:
                continue
            i=k+1
            j=l-1
            while i<j:
                s=nums[k]+nums[i]+nums[j]
                if s<0:
                    i+=1
                    while i<j and nums[i]==nums[i-1]: 
                        i+=1
                elif s>0:
                    j-=1
                    while i<j and nums[j]==nums[j+1]:
                        j-=1
                else:
                    res.append([nums[k],nums[i],nums[j]])
                    i+=1
                    j-=1
                    while i<j and nums[i]==nums[i-1]:
                        i+=1
                    while i<j and nums[j]==nums[j+1]:
                        j-=1
        return res

42. 接雨水

在这里插入图片描述双指针,每一列找左边最大,和右边最大,左右当中的短板就是倒水的极限

class Solution(object):
    def trap(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        volume=0
        for i in range(1,len(height)-1):
            max_left=0
            for j in range(i-1,-1,-1):
                max_left=max(max_left,height[j])
            max_right=0
            for j in range(i+1,len(height)):
                max_right=max(max_right,height[j])
            min_one=min(max_left,max_right)
            if min_one>height[i]:
                volume+=min_one-height[i]

        return volume

再精简一点:

class Solution(object):
    def trap(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        volume = 0
        left_max = 0
        right_max = 0
        left = 0
        right = len(height) - 1
        
        while left < right:
            if height[left] < height[right]:
                if height[left] >= left_max:
                    left_max = height[left]
                else:
                    volume += left_max - height[left]
                left += 1
            else:
                if height[right] >= right_max:
                    right_max = height[right]
                else:
                    volume += right_max - height[right]
                right -= 1
                
        return volume

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值