阿里巴巴2017实习生春招编程测验 —— 数组四等分

对于一个长度为N的整型数组A, 数组里所有的数都是正整数,对于两个满足0 <= X <= Y < N的整数,A[X], A[X+1] … A[Y]构成A的一个切片,记作(X, Y).
用三个下标 m1, m2, m3(下标满足条件0 < m1, m1 + 1 < m2, m2 +1 < m3 < N – 1)可以把这个整型数组分成(0, m1-1), (m1+1, m2-1), (m2+1, m3-1), (m3+1, N-1) 四个切片。
如果这四个切片的整数求和相等,称作“四等分”。

编写一个函数,求一个给定的整型数组是否可以四等分,如果可以,返回一个布尔类型的true,如果不可以返回一个布尔类型的false。
限制条件:数组A最多有1,000,000项,数组中的整数取值范围介于-1,000,000到1,000,000之间。
要求:函数的计算复杂度为O(N),使用的额外存储空间(除了输入的数组之外)最多为O(N)。

例子:
对于数组A=[2, 5, 1, 1, 1, 1, 4, 1, 7, 3, 7] 存在下标 2, 7, 9使得数组分成四个分片[2, 5], [1, 1, 1, 4], [7], [7],这三个分片内整数之和相等,所以对于这个数组,函数应该返回true。
对于数组 A=[10, 2, 11, 13, 1, 1, 1, 1, 1],找不到能把数组四等分的下标,所以函数应该返回false。

今年参加了阿里的实习生春招,在进行编程测验之前已经了解到部分同学遇到的是这道题,所以事先做了准备,然而轮到我时已经换题了,可能是不同岗位题目不一样吧。

这道题描述的啰哩啰嗦,实际上就是给一个全是正数的数组,问是否能将该数组分割成四部分,每一部分累加和相等,分割点不算

要解决这题首先要明确数组四等分的结构,即3个分割点,4个切片,有了这个概念,在草纸上画画,问题很容易就解决了。

首先我们遍历一遍数组构造一个HashMap存储 ( arr[i]左边所有元素的和 , i ) ,然后大多数人选择让分割点m1、m3从两端像中间移动的同时累加两个切片内元素(谁小谁移动),当两个切片相等时根据四等分结构看能否找到满足条件的分割点m2。

这里我选择仅将分割点m1由左向右移动,如果数组可以四等分,依据3个分割点,4个切片这样一个基本结构,一旦分割点m1确定了,m2、m3也就相应确定了,如果最后找不到符合基本结构的m2、m3,则可以断定数组不可以四等分,时间复杂度O(N),代码如下:

public static boolean canSplits(int[] arr) {
    if (arr == null || arr.length < 7) {    // 元素个数小于7,无法构成3个分割点、4个切片的基本结构
        return false;
    }
    HashMap<Long, Integer> leftSumToIndex = new HashMap<>();
    Long sum = (long) arr[0];
    for (int i = 1; i < arr.length; i++) {
        leftSumToIndex.put(sum, i);    // 把(arr[i]左边所有元素的和, i)存入HashMap
        sum += arr[i];
    }
    Long part = (long) arr[0];         // part为切片内元素的和
    for (int m1 = 1; m1 < arr.length - 5; m1++) {   // 遍历分割点m1
        Long m2LeftSum = part + arr[m1] + part;     // 分割点m2左边所有元素的和
        if (leftSumToIndex.containsKey(m2LeftSum)) {
            int m2 = leftSumToIndex.get(m2LeftSum);
            Long m3LeftSum = m2LeftSum + arr[m2] + part;  // 分割点m3左边所有元素的和
            if (leftSumToIndex.containsKey(m3LeftSum)) {
                int m3 = leftSumToIndex.get(m3LeftSum);
                if (m3LeftSum + arr[m3] + part == sum) {
                    return true;
                }
            }
        }
        part += arr[m1];
    }
    return false;
}

对于像Two SumLongest Substring Without Repeating Characters以及本题这种涉及数组下标的一系列问题,优先考虑事先构造一个HashMap看是否对后续的求解有帮助。在HashMap中,每次查询操作的时间复杂度均为O(1),所以它一直是编写高效算法的利器。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容

  • 贪心算法 贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上...
    fredal阅读 9,194评论 3 52
  • 来源:NumPy Tutorial - TutorialsPoint 译者:飞龙 协议:CC BY-NC-SA 4...
    布客飞龙阅读 32,642评论 6 96
  • 数组在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称...
    朱森阅读 3,882评论 2 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,579评论 18 139
  • 先决条件 在阅读这个教程之前,你多少需要知道点python。如果你想从新回忆下,请看看Python Tutoria...
    舒map阅读 2,561评论 1 13