问题描述
LeetCode 3698题“Split Array With Minimum Difference”要求将一个数组分成两个非空子数组,使得两个子数组的和的绝对差最小。具体来说,给定一个整数数组,找到一个分割点,使得左边子数组的和与右边子数组的和的绝对差最小。
解题思路
解决该问题的关键在于遍历所有可能的分割点,计算左右子数组的和,并找出最小的绝对差。直接遍历所有分割点的时间复杂度是O(n),其中n是数组的长度,这在计算上是可行的。
方法一:前缀和法
使用前缀和数组可以高效地计算任意子数组的和。前缀和数组的第i个元素表示原数组前i个元素的和。通过前缀和数组,可以在O(1)时间内得到任意子数组的和。
- 计算前缀和数组。
- 遍历所有可能的分割点,计算左右子数组的和的绝对差。
- 记录最小的绝对差。
代码示例
def minimumDifference(nums):
n = len(nums)
prefix = [0] * (n + 1)
for i in range(n):
prefix[i + 1] = prefix[i] + nums[i]
min_diff = float('inf')
for i in range(1, n):
left_sum = prefix[i]
right_sum = prefix[n] - prefix[i]
diff = abs(left_sum - right_sum)
if diff < min_diff:
min_diff = diff
return min_diff
方法二:空间优化
前缀和数组需要额外的O(n)空间,但可以通过实时计算左右子数组的和来优化空间复杂度到O(1)。
- 计算整个数组的总和。
- 遍历数组,实时累加左边子数组的和,右边子数组的和可以通过总和减去左边子数组的和得到。
- 计算并比较绝对差。
代码示例
def
### 问题描述
LeetCode 3698题“Split Array With Minimum Difference”要求将一个数组分成两个非空子数组,使得两个子数组的和的绝对差最小。具体来说,给定一个整数数组,找到一个分割点,使得左边子数组的和与右边子数组的和的绝对差最小。
### 解题思路
解决该问题的关键在于遍历所有可能的分割点,计算左右子数组的和,并找出最小的绝对差。直接遍历所有分割点的时间复杂度是O(n),其中n是数组的长度,这在计算上是可行的。
### 方法一:前缀和法
使用前缀和数组可以高效地计算任意子数组的和。前缀和数组的第i个元素表示原数组前i个元素的和。通过前缀和数组,可以在O(1)时间内得到任意子数组的和。
1. 计算前缀和数组。
2. 遍历所有可能的分割点,计算左右子数组的和的绝对差。
3. 记录最小的绝对差。
#### 代码示例
```python
def minimumDifference(nums):
n = len(nums)
prefix = [0] * (n + 1)
for i in range(n):
prefix[i + 1] = prefix[i] + nums[i]
min_diff = float('inf')
for i in range(1, n):
left_sum = prefix[i]
right_sum = prefix[n] - prefix[i]
diff = abs(left_sum - right_sum)
if diff < min_diff:
min_diff = diff
return min_diff
方法二:空间优化
前缀和数组需要额外的O(n)空间,但可以通过实时计算左右子数组的和来优化空间复杂度到O(1)。
- 计算整个数组的总和。
- 遍历数组,实时累加左边子数组的和,右边子数组的和可以通过总和减去左边子数组的和得到。
- 计算并比较绝对差。
代码示例
def
1878

被折叠的 条评论
为什么被折叠?



