题目地址: https://www.hackerrank.com/challenges/maximum-subarray-sum/problem?isFullScreen=false

简述:在给定正整数组中,找到任意连续子数组求和后对M取余的最大值。

栗子

当a = [3,2,7,4] 且 m=7 时,返回6。因为子数组[2,7,4]求和后对7取余可取到最大值6。

难度:Hard

解题

先正常搞。直接切片一行搞定。结果肯定是无法通过全部测试的。原因主要是因为切片的执行时间太长,其次是因为有2个for迭代。

def maximumSum(a, m):return max([sum(a[i:j]) % m for i in range(len(a)) for j in range(i+1,len(a)+1)])

通过分析子数组情况我们可知,例子中子数组 [3,2,7] 和子数组 [3,2] 存在交集或者说重复的部分。若我们已经知道子数组 [3,2] 对m求余的值为R[3,2],则 [3,2,7] 对m取余的值 R[3,2,7] = (R[3,2] + 7) % m。知道这一点以后,我们便可以构建数组a的prefix sum 来解决这个问题。

接上面的例子,数组a的对m求余的prefix sum数组presum_a = [3,5,5,2],其中

presum_a[1] = (presum_a[0] + a[1]) % m = (3+2)%7 = 5

presum_a[2] = (presum_a[1] + a[2]) % m = (5+7)%7 = 5

当我们有了presum_a以后,事情就好办了。由于求余运算的性质,presum_a中每个元素取值范围为 [0, 7) ,并且通过观察我们可知presum_a[3] < presum_a[0],可知a的子数组[2,7,4]是一个值得考虑的对象。因为当j > i时,presum_a中任意两个元素差值的绝对值abs(presum_a[i] - presum_a[j])就代表a中从i到j的子数组求和并对m取余的值,与m之间的差值,即

abs(m - (a[i] +... + a[j])%m)

若这个差值越小,则代表我们我们求和取余的值越大。因此,由于abs(presum_a[3] - presum_a[0]) = 1,这代表a[1]到a[3]至少加了一个6或者6的倍数,而6是对7求余能够得到的最大值。

那么问题就简单啦,根据上面描述的例子,当我们只需要找到presum_a中任意两元素差值绝对值的最小值d = min(abs(presum_a[i] - presum_a[j])),并且拿m - d与presum_a中的最大值作比较max(max(presum_a), m-d),选择两者中大的那一个即可。

def maximumSum(a, m):# 原始数组a的值在做完prefix sum后没有价值了,不需要保存,因此可直接在原数组上滚。a[0] = a[0]%mfor i in range(1,len(a)):a[i] = (a[i - 1] + a[i])%mmax_d = max(a)                              # 拿到滚出来的最大值a = list(zip(a,[i for i in range(len(a))])) # 把元素index贴上,用来判断j > ia.sort()                                    # 来一手排序,减少找任意两元素差值最小值的计算量d = min([abs(a[i][0]-a[i+1][0]) for i in range(len(a)-1) if a[i][1] > a[i+1][1]])return max(max_d,m-d)

程序整体除了排序O(nlogn)时间,其余O(n)时间,因此程序整体O(nlogn)时间。

Python HackerRank 刷题 Maximum Subarray Sum相关推荐

  1. Python小屋刷题软件2425道题目分类速查表

    "Python小屋"编程比赛正式开始 Python小屋刷题软件客户端使用说明(视频讲解) Python小屋刷题神器最近升级的新功能介绍 每次录入新题目时都会更新下面的分类表,请注意 ...

  2. python 制作刷题程序

    python 制作刷题程序 本着方便刷题的目的,作者希望一些在电脑上学习的小伙伴能方便记笔记和刷题练习,然后就做出了这个软件,此程序主要通过截图来保存题目和一些知识点,目前几乎完善完毕,由于可能会出现 ...

  3. 温馨提示--Python小屋刷题神器明天暂停使用1天

    号外号外--Python小屋刷题神器上线啦 温馨提示: Python小屋刷题神器已经连续运行3个月,受到广大Python爱好者的喜爱,每天都有很多朋友在平台上做题练习和学习. 马上就期末了,应任课老师 ...

  4. Python小屋刷题神器最近升级的新功能介绍

    推荐图书: <Python程序设计(第3版)>,(ISBN:978-7-302-55083-9),董付国,清华大学出版社,2020年6月第1次印刷,2021年1月第6次印刷,山东省一流本科 ...

  5. Python小屋刷题神器题目分类速查表

    每次录入新题目时都会更新下面的分类表,请注意查看最新信息. 客观题: Python基础知识:1-36 内置函数.运算符:37-271 列表.元组.字典.集合.切片.推导式:272-679 选择结构与循 ...

  6. Python基础刷题录-1

    Python基础刷题录 2020-08-27 1.实现输出1 - 2 + 3 - 4 + 5 - 6 ... + 99的和 2.改变语句的大小写,使其符合英语书写规范 3.利用下划线将列表的每一个元素 ...

  7. python基础刷题_数据结构与算法LeetCode刷题(Python)

    参考资料: 一.链表 1.  链表的必备知识要点(包括基础知识.刷题中使用的STL等知识) 2.  链表逆序(LeetCode 92 ,206. Reverse Linked List 1,2) 3. ...

  8. python oj刷题网站_程序员常用的刷题网站

    1.Lintcode Lintcode.com--LintCode网站是国内较大的在线编程&测评网站.此网站提供各大IT公司的算法面试题类型,行分门别类,由简单到中等,再到难,便于不同水平的程 ...

  9. python面试刷题app_Python面试的一些心得,与Python练习题分享

    关于基础 项目打算招聘一个自动化运维,主要需求是python.Linux与shell脚本能力.但面试几天发现一些问题: 简历虚假 这个不管哪行,简历含水量大都是普遍存在的,看简历犀利的一比,一面是能力 ...

最新文章

  1. 云炬随笔20211126(2)
  2. 《Swift开发实战》——导读
  3. java treemap_Java TreeMap lastKey()方法与示例
  4. python爬虫 点击下一页_python爬虫实现获取下一页代码
  5. Activiti 流程实例、任务、执行对象及相关的表
  6. 突然想起今天的博客汇报没写
  7. VSCode Debug API
  8. 2003服务器系统QQ安装不了,windows2003server
  9. 黑域,黑阈 Permission denied
  10. 数据中心能效管理系统有哪些平台功能?一分钟了解
  11. WGS84转GCj02
  12. C#与C++混合编程及性能分析
  13. 程序性能优化之编译器篇(Racoon)
  14. 蹦迪--我的黑白玫瑰~!
  15. 物联网开发 7 旗点云物联网云平台
  16. 《跨社交网络的隐私图片分享框架》EI
  17. oracle-1480,1400,1438错误一些解决方式
  18. SCI科研论文配图插图绘制推荐-博图汇科研绘图
  19. 基于反事实的因果推理Causal inference based on counterfactuals--一万六千字文献详细解读(因果关系的推理应用)【全文总结】
  20. 作业一:我与软件工程相约

热门文章

  1. 网络系统管理模块B考核题目(windows2019)
  2. 机械零件委托加工合同
  3. 【历史上的今天】8 月 9 日:人工智能理论的奠基者诞生;鸿蒙 OS 发布;“云计算”概念被提出
  4. 【Linux】Ubuntu20网络频繁掉线解决
  5. [Alg]排序算法之分布排序
  6. S3C2440移植linux3.4.2内核之内核框架介绍及简单修改
  7. uni-app实现app内嵌微信文章
  8. Python数学建模—线性规划
  9. android 呼叫转移 延时,Android:在延迟后设置呼叫转移
  10. 关于以太网IO模块如何选型