本文介绍: 给定一个由若干整数组成的数组nums可以数组内的任意位置进行分割,将该数分割成两个非空子数组(即左数组和右数组),分别对子数组求和得到两个值,计算这两个值的差值,请输出所有分割方案中,差值最大的值。第一行输入数组中元素个数n,1

题目

给定一个由若干整数组成的数组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

思路

前缀解决
分割的两个部分,前面的和为prefixSum
后面的和为:total-prefixSum
题目要求的值:|2prefixSum-total|的最大值
所以遍历数组,记录前缀和,求表达式最大值即可

题解

package hwod;

import java.util.Arrays;
import java.util.Scanner;

public class SplitNumsMaxDiff {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = Integer.parseInt(sc.nextLine());
        int[] nums = new int[n];
        for (int i = 0; i < n; i++) {
            nums[i] = sc.nextInt();
        }
        System.out.println(splitNumsMaxDiff(nums));
    }

    private static int splitNumsMaxDiff(int[] nums) {
        int prefixSum = 0, maxDiff = Integer.MIN_VALUE;
        int total = Arrays.stream(nums).sum();
        for (int i = 0; i < nums.length; i++) {
            prefixSum += nums[i];
            int diff = Math.abs(2 * prefixSum - total);
            if(diff>maxDiff) maxDiff = diff;
        }
        return maxDiff;
    }
}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA)查看当前专栏更新的所有题目。

原文地址:https://blog.csdn.net/qq_31076523/article/details/134688385

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_7953.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注