Leetcode 普通数组 1
1. LeetCode 53. 最大子数组和 ↑
题目
给你一个整数数组 nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
测试样例
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6。
示例 2:
输入:nums = [1]
输出:1
示例 3:
输入:nums = [5,4,-1,7,8]
输出:23
代码(Python)
class Solution(object):
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
dp = [0] * len(nums)
dp[0] = nums[0]
sum = nums[0]
for i in range(1, len(nums)):
dp[i] = max(nums[i] + dp[i - 1], nums[i])
sum = max(sum, dp[i])
return sum
思路解析
- 定义
dp[i]为以i结尾的连续子数组的最大和。要么把当前元素nums[i]接在前面的子数组后面(nums[i] + dp[i-1]),要么就从当前元素重新开始(nums[i]),取两者较大。 - 用一个变量
sum维护所有dp[i]中的最大值,也就是答案。 - 遍历一遍数组即可完成状态转移,时间复杂度为 O(n),空间复杂度为 O(n)。
2. LeetCode 56. 合并区间 ↑
题目
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [start_i, end_i]。
请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
测试样例
示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠,将它们合并为 [1,6]。
示例 2:
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
示例 3:
输入:intervals = [[4,7],[1,4]]
输出:[[1,7]]
解释:区间 [1,4] 和 [4,7] 可被视为重叠区间。
代码(Python)
class Solution(object):
def merge(self, intervals):
if not intervals:
return []
# 按区间起点排序
intervals.sort(key=lambda x: x[0])
merged = []
current = intervals[0]
for interval in intervals[1:]:
if interval[0] <= current[1]: # 有重叠,扩展右端点
current[1] = max(current[1], interval[1])
else: # 无重叠,收当前区间,开始新的区间
merged.append(current)
current = interval
merged.append(current) # 添加最后一个区间
return merged
思路解析
- 先按每个区间的起点从小到大排序,这样重叠的区间会被排在一起。
- 用
current记录当前正在合并的区间,从左到右遍历后续区间:- 如果新区间左端点
interval[0]小于等于current[1],说明重叠,更新右端点为max(current[1], interval[1]); - 否则表示不重叠,把
current放进结果数组,然后把current换成新区间。
- 如果新区间左端点
- 遍历结束后别忘了把最后一个
current加入结果。整体只排序一次再线性扫描,时间复杂度为 O(n log n),空间复杂度 O(1)(不计结果数组)。

浙公网安备 33010602011771号