分割数组的最大差值 - 华为OD统一考试
OD统一考试
分值: 100分
题解: Java / Python / C++
题目描述
给定一个由若干整数组成的数组nums ,可以在数组内的任意位置进行分割,将该数组分割成两个非空子数组(即左数组和右数组),分别对子数组求和得到两个值.计算这两个值的差值,请输出所有分割方案中,差值最大的值。
输入描述
第一行输入数组Q中元素个数n,1< n < 100000
第二行输入数字序列,以空格进行分隔,数字取值为4字节整数
输出描述
输出差值的最大取值
示例1
输入:
6
1 -2 3 4 -9 7输出:
10
题解
简单模拟题,需要小心的是数据范围。
Java
import java.util.Scanner;
/*** @author code5bug*/
public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int[] nums = new int[n];long sum = 0;for (int i = 0; i < n; i++) {int num = scanner.nextInt();sum += num;nums[i] = num;}long maxAbs = 0, leftSum = 0;for (int i = 0; i < n - 1; i++) {leftSum += nums[i];// rightSum = sum - leftSum, 差值 = rightSum - leftSum = Math.abs(sum - leftSum)maxAbs = Math.max(maxAbs, Math.abs(sum - 2 * leftSum));}System.out.println(maxAbs);}
}
Python
n = int(input())
nums = list(map(int, input().split()))sum_val,max_abs,left_sum = sum(nums),0,0for i in range(n - 1):left_sum += nums[i]# right_sum = sum - left_sum, 差值 = right_sum - left_sum = abs(sum - left_sum)max_abs = max(max_abs, abs(sum_val - 2 * left_sum))print(max_abs)
C++
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int main() {long long sum = 0;int n, num;cin >> n;vector<int> nums(n);for(int i=0; i<n; i++) {cin >> num;sum += num;nums[i] = num;}long long max_abs = 0, left_sum = 0;for(int i=0; i<n-1; i++) {left_sum += nums[i];// right_sum = sum - left_sum, 差值 = right_sum - left_sum = abs(sum - left_sum)max_abs = max(max_abs, abs(sum - 2 * left_sum));}cout << max_abs << endl;
}
🙏整理题解不易, 如果有帮助到您,请给点个赞 ❤️ 和收藏 ⭐,让更多的人看到。🙏🙏🙏