0206leetcode刷题5道python

42

题目描述:
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

示例:
在这里插入图片描述
解答:

class Solution:
    def trap(self, height: List[int]) -> int:
        n=len(height)
        res=0

        if n<3:
            return 0
        
        leftMax,rightMax=height[0],height[-1]
        left,right=0,n-2

        while left<=right:
            minVal=min(leftMax,rightMax)
            if minVal==leftMax:
                if minVal>height[left]:
                    res+=minVal-height[left]
                leftMax=max(leftMax,height[left])
                left+=1
            else:
                if minVal>height[right]:
                    res+=minVal-height[right]
                rightMax=max(rightMax,height[right])
                right-=1
        return res

643

题目描述:
给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数。

示例:
在这里插入图片描述
解答:

class Solution:
    def findMaxAverage(self, nums: List[int], k: int) -> float:
        nums.append(0)
        ans = -inf
        left, right = 0, k-1
        s = sum(nums[:k])
        while right+1 < len(nums):
            ans = max(ans, s / k)
            s -= nums[left]
            left += 1
            right += 1
            s += nums[right]
        return ans

剑指offer39

题目描述:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例:
在这里插入图片描述
解答:

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        '''
        数组排序,那么排序之后位于数组中间的数字一定就是那个出现次数超过数组长度一半的数字。
        也就是说,这个数字就是统计学上的中位数,即长度为n的数组中第n/2 大的数字。
        nums=sorted(nums)
        return nums[len(nums)//2]
        '''
        count, majority = 1, nums[0]
        for num in nums[1:]:
            if count == 0:
                majority = num
            if num == majority:
                count += 1
            else:
                count -= 1
        return majority

剑指offer40

题目描述:
输入整数数组 arr ,找出其中最小的 k 个数。
例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。

示例:
在这里插入图片描述
解答:

class Solution:
    def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:
        if k > len(arr) or k == 0:
            return []
        result = arr[:k]
        for num in arr[k:]:
            temp_max = max(result)
            if num < temp_max:
                result.remove(temp_max)
                result.append(num)
        return result

剑指offer42

题目描述:
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。

示例:
在这里插入图片描述
解答:

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        for i in range(1,len(nums)):
            nums[i]=nums[i]+max(nums[i-1],0)
        return max(nums)

猜你喜欢

转载自blog.csdn.net/yeqing1997/article/details/113619029