等值首尾和问题及其思考、解决和总结

问题 等值首尾和

假设有一个数组x[],它有n个元素,每一个都大于零;称x[0] + x[1] + … + x[i]为前置和(Prefix Sum),

而x[j] + x[j+1] + … + x[n-1]为后置和(Suffix Sum)。试编写一个程序,求出x[]中有多少组相同的前置和与后置和。

最容易想到的当然是把前置和与后置和分别算出来放到两个长度为n的数组里面,再检索两个数组相同的元素。

但我们可以注意到每个元素都大于0,所以前置和与后置和都是递增的。于是我们可以:

设置前后两个游标

前置和大于后置和,则后游标向前移位,同时后置和加上相应元素;

同理,前置和小于后置和,前游标向后移位,前置和加上相应元素;

两者相等,则统计数目加1,同时执行两步操作。

直到某一个或两个游标到达终点

下面是我的代码


 1 // 最差情况,交替上升,执行代码 2n 次,n为数组长度
2 int GetHeadTail(int * a, int lenA)
3 {
4 int count = 0; // 统计数
5 int prefixSum = 0; // 前置和
6 int suffixSum = 0; // 后置和
7 int head = 0; // 前游标
8 int tail = lenA - 1; // 后游标
9 while (head < lenA && tail >= 0)
10 {
11 prefixSum += a[head++];
12 suffixSum += a[tail--];
13 while (prefixSum < suffixSum && head < lenA)
14 { // 向后遍历
15 prefixSum += a[head++];
16 }
17 while (suffixSum < prefixSum && tail >= 0)
18 { // 向前遍历
19 suffixSum += a[tail--];
20 }
21 if (prefixSum == suffixSum)
22 {
23 count++;
24 }
25 }
26 return count;
27 }

本来用的for循环,逻辑一样,却导致代码看上去很凌乱。后来改成了while循环,简洁多了。因此还沾沾自喜,再看看作者的答案


 1 int head_tail(int x[], int n)
2 {
3 int prefix = 0, suffix = 0;
4 int prefix_idx = 0, suffix_idx = n - 1;
5 int count = 0;
6
7 while (prefix_idx < n && suffix_idx >= 0)
8 {
9 if (prefix < suffix)
10 prefix += x[prefix_idx++];
11 else if (suffix < prefix)
12 suffix += x[suffix_idx--];
13 else {
14 count++;
15 suffix += x[suffix_idx--];
16 prefix += x[prefix_idx++];
17 }
18 }
19 return count;
20 }

作者的逻辑清晰,代码整洁。  而我的还有一个bug————可能会漏掉前后全部加完的情况。

问题及答案来源————《C语言名题精选百则技巧篇》问题1.5

等值首尾和问题及其思考、解决和总结,码迷,mamicode.com

时间: 2024-10-08 10:44:44

等值首尾和问题及其思考、解决和总结的相关文章

每日一小练——等值首尾和

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:等值首尾和 内容: 假设有一个数组x[],它有n个元素,每一个都大于零:称x[0]+x[1]+...+x[i]为前置和,而x[j]+x[j+1]+...+x[n-1]为后置和.试编写一个程序,求出x[]中有多少组相同的前置和后置和. 例如:x[]的元素是3,6,2,1,4,5,2,于是x[]的前置和有以下7个,即3,9,11,12,16,21,23:后置和则2,7,11,12,14,20,23; 于是11,12,23,

一个想法照进现实-《IT连》创业项目:聊聊IT连App是如何思考解决IT人员单身问题的

前言: 根据最早我编写的IT联盟社区众筹计划书的思路方向:社交->资讯=>评级=>培训. 现在在实现第一个阶段中,而且这个阶段可能会走很久. 今天开文,主要是讲述一下,现在的版本为什么是现在这样子的,以及我是怎么思考的. IT男的工作状态: 平时工作就很晚,中间还要花好几小时在上下班路上. 周末一躺,睁眼又重复性的进入循环状态. 妹子何处寻? IT男的工作状态和工作环境,决定了大多数IT男异性圈子都小,依靠线下渠道几乎受限. 对于天天对着电脑的大伙,网络便是最便捷的渠道,而社交软件便是主

关于SSH 持久对象转Json双向关联解析过度的解决办法

小弟是一名被部分程序员所鄙视的培训狗,昨天做项目遇到一个问题,在SSH框架通过ajax向界面传递数据的时候,由于对象之间双向关联导致json解析过度,造成内存溢出,网上搜索了解决办法除了过滤某些关联对象之外就没有别的办法了,我的想法是通过设置解析深度来解决过度抓取的问题,开始也考虑性能问题,最好的解决办法就是做一个视图,单独写一个model .但是又不希望这样繁琐,后来发现换个观点一想,能解决这个过度解析的问题对系统的性能的提升其实也很大了,所以就自己动手准备写一个转换工具类,办法也很明了递归.

Exception in thread &quot;main&quot; java.lang.NoClassDefFoundError: org/apache/hadoop/yarn/util/Apps Hadoop2.6.0编程问题与解决

从hadoop 1.2.1升级到 Hadoop2.6.0,调试写代码,还是遇到一些问题的.这里记录一下,后续如果自己再遇到类似问题,那也好找原因了. 在eclipse里编译运行 WordCount,出现以下错误. Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/yarn/util/Apps at java.lang.ClassLoader.defineClass1(Native M

如何分析解决Android ANR

来自: http://blog.csdn.net/tjy1985/article/details/6777346 http://blog.csdn.net/tjy1985/article/details/6777355 http://blog.csdn.net/tjy1985/article/details/6777983 http://www.eoeandroid.com/forum.php?mod=viewthread&tid=165974 =========================

4步解决网站被恶意泛域名解析的难题

貌似最近不有少的网站被人做了恶意泛域名解析,连xbiao.c_o_m也在其中,见下图1.鉴于许多朋友遇到了这样的问题,我就把自己处理这个被恶意泛解析难题时的过程发出来,仅供大家参考之.如果大家有什么不明白的地方,欢迎找我单聊,我可以提供技术指导.也在此感谢松松提供这个机会与大家交流. ------以下是正文开始------- 今天在照例检查我们的网站时,突然发现site结果中出现了很多博彩类的二级域名,立即意识到我们的网站被人做了恶意泛域名解析了!见图1: 图1:网站被恶意泛解析的截图记录 泛域

思考与实践的节奏

一般来说,当我们学习某一个领域里面的知识的时候,我们更多做的事情是跟着“某个人”(比如某书的作者)来学习这个领域里面众多的概念和这些概念之间的关系,清楚了概念和关系之后,再进行练习和实践. 即使学习的再好,如果不练习不实践,这些知识也是没有用处的. 那么,上面的学习方式有没有什么问题呢? 答案是肯定的,问题就在于我们探究领域里面概念之间关系的方式错误了,我们不应该只按照作者限定的思路去接触关系,而是应该从wishfull thinking的角度提出问题(或者说是一些问题的例子),通过解决这些一个

01大脑是如何思考和决策的

想必大家都听过一首歌,跟着感觉走,听起来并不赖,确实凭直觉引导行事能解决生活中的很多问题. 但过往踩过无数坑告诉我们,大多时候凭直觉并不可靠.我们很容易先入为主,并被情绪和固有的印象干扰而作出错误的判断. 如何避免决策过程中的认知偏差?如何正确认识人类思维中的非理性?带着以上疑问,借<思考,快与慢>这本书,和大家分享下如何规避偏见,提升判断和自行决策的效能. 在探讨如何提升决策效率前,我们有必要了解下我们大脑的运作方式. 心理学家将大脑分为两种思维模式 系统1:无意识且快速的,不怎么费脑力,没

软件工程概论课堂作业3

题目:返回一个整数数组中最大子数组的和 要求: 输入一个一维整形数组,数组里有正数也有负数. 一维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 设计思想: 用户自定义数组长度并依次输入数组元素,设一个全局变量初始化为零的数组a[N],N=10000: 1.因为该数组首尾相接可视作一个环,那么我们需要在一个合适的位置断开,把数组元素展成一条笔直的带子. (1).设用户自定义数组长度为m,输入数组各元素值a[1