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)