JAVA题解,含详细注释 | 喜欢切数组的红

喜欢切数组的红

https://www.nowcoder.com/practice/74cb703f25dc4956acb3b08028a1f4b4

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        long ans = 0;
        long[] a = new long[n + 1]; //原数组
        long[] s = new long[n + 1]; //前缀和数组
        int[] c = new int[n + 1];   //正数个数前缀和
        HashMap<Long, ArrayList<Integer>> map = new HashMap<>();
        for (int i = 1; i <= n; i++) {
            a[i] = in.nextInt();
            s[i] = a[i] + s[i - 1];
            c[i] = c[i - 1] + (a[i] > 0 ? 1 : 0);
            //map的key是从1到i元素的和,value是一个数组存前缀和相同的所有下标i
            map.computeIfAbsent(s[i], k -> new ArrayList<>()).add(i);
        }
        for (int i = n; i > 2; i--) {   //i及i后面的部分是切后第三部分
            long sum = s[n] - s[i - 1];
            if (c[n] - c[i - 1] == 0) continue;
            if (map.containsKey(sum)) {     //用第三部分的和,找第一部分右端点
                for (Integer p : map.get(sum)) {
                    if (p >= i) continue;       //第一部分右端点需要在i左边
                    if (c[p] == 0) continue;
                    if (s[i - 1] - s[p] != sum) continue;
                    if (c[i - 1] - c[p] == 0) continue;
                    ans++;
                }
            }
        }
        System.out.println(ans);
        in.close();
    }
}

全部评论

相关推荐

牛客92804383...:在他心里你已经是他的员工了
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务