#P3058. 分割数组的最大差值(100分)
          
                        
                                    
                      
        
              - 
          
          
                      1000ms
            
          
                      Tried: 102
            Accepted: 52
            Difficulty: 3
            
          
          
          
                       所属公司 : 
                              华为od
                                
            
                      
          
 
- 
                        算法标签>前缀和          
 
分割数组的最大差值(100分)
题面描述
给定一个由若干整数组成的数组 nums,我们可以在数组内的任意位置进行分割,将该数组分割成两个非空子数组(即左数组和右数组),分别对子数组求和得到两个值,计算这两个值的差值,请输出所有分割方案中,差值最大的值。
思路
我们需要在数组 nums 中找到一个分割点,使得左子数组和右子数组的和之差最大。可以通过以下步骤来实现:
- 计算整个数组的总和 
total。 - 使用一个变量 
left_sum来维护左子数组的和。 - 遍历数组,逐步增加 
left_sum,同时计算右子数组的和right_sum = total - left_sum。 - 在每一步中计算差值 
abs(left_sum - right_sum),并更新最大差值。 
复杂度分析
- 时间复杂度:O(n),我们只需遍历数组两次。
 - 空间复杂度:O(1),只使用常量空间。
 
cpp
#include <iostream>
#include <vector>
#include <cstdlib> // abs函数
using namespace std;
int maxDifference(const vector<int>& nums) {
    int total = 0, left_sum = 0, max_diff = 0;
    
    // 计算数组总和
    for (int num : nums) {
        total += num;
    }
    
    // 遍历并计算差值
    for (int i = 0; i < nums.size() - 1; ++i) {
        left_sum += nums[i];
        int right_sum = total - left_sum;
        max_diff = max(max_diff, abs(left_sum - right_sum));
    }
    
    return max_diff;
}
int main() {
    int n;
    cin >> n; // 输入元素个数
    vector<int> nums(n);
    
    for (int i = 0; i < n; ++i) {
        cin >> nums[i]; // 输入数字序列
    }
    
    cout << maxDifference(nums) << endl; // 输出最大差值
    return 0;
}
python
def max_difference(nums):
    total = sum(nums)  # 计算数组总和
    left_sum = 0
    max_diff = 0
    
    # 遍历并计算差值
    for i in range(len(nums) - 1):
        left_sum += nums[i]
        right_sum = total - left_sum
        max_diff = max(max_diff, abs(left_sum - right_sum))
    
    return max_diff
def main():
    n = int(input())  # 输入元素个数
    nums = list(map(int, input().split()))  # 输入数字序列
    
    print(max_difference(nums))  # 输出最大差值
if __name__ == "__main__":
    main()
java
import java.util.Scanner;
public class Main {
    
    public static int maxDifference(int[] nums) {
        int total = 0, leftSum = 0, maxDiff = 0;
        
        // 计算数组总和
        for (int num : nums) {
            total += num;
        }
        
        // 遍历并计算差值
        for (int i = 0; i < nums.length - 1; i++) {
            leftSum += nums[i];
            int rightSum = total - leftSum;
            maxDiff = Math.max(maxDiff, Math.abs(leftSum - rightSum));
        }
        
        return maxDiff;
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        int n = scanner.nextInt(); // 输入元素个数
        int[] nums = new int[n];
        
        for (int i = 0; i < n; i++) {
            nums[i] = scanner.nextInt(); // 输入数字序列
        }
        
        System.out.println(maxDifference(nums)); // 输出最大差值
        scanner.close();
    }
}
        题目内容
给定一个由若干整数组成的数组 nums ,可以在数组内的任意位置进行分割,将该数组分割成两个非空子数组(即左数组和右数组),分别对子数组求和得到两个值,计算这两个值的差值,请输出所有分割方案中,差值最大的值。
输入描述
第一行输入数组中元素个数 n ,1<n≤100000 第二行输入数字序列,以空格进行分隔,数字取值为 4 字节整数
输出描述
输出差值的最大取值
样例1
输入
6
1 -2 3 4 -9 7
输出
10
说明
将数组 nums 划分为两个非空数组的可行方案有:
左数组 = [1] 且 右数组 = [-2,3,4,-9,7],和的差值 = | 1 - 3 | = 2
左数组 = [1,-2] 且 右数组 = [3,4,-9,7],和的差值 = | -1 - 5 | =6
左数组 = [1,-2,3] 且 右数组 = [4,-9,7],和的差值 = | 2 - 2 | = 0
左数组 = [1,-2,3,4] 且右数组=[-9,7],和的差值 = | 6 - (-2) | = 8,
左数组 = [1,-2,3,4,-9] 且 右数组 = [7],和的差值 = | -3 - 7| = 10最大的差值为10