面试题57 - II. 和为s的连续正数序列

和为s的连续正数序列

题目描述

输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。

序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。


示例:

输入:target = 9
输出:[[2,3,4],[4,5]]

输入:target = 15
输出:[[1,2,3,4,5],[4,5,6],[7,8]]


提示:
1 <= target <= 10^5

转载来源:力扣(LeetCode)


题目分析

一开始想这题是关于数组的求和,很有可能是和动态规划有关,考点就是通过动态规划来存放中间计算量,来达到加速效果,不然会卡时间超限,嗯我真是天才,一看题目什么都知道了;


动态规划

然后就秒想出状态转移方程sum[i][j] = sum[i-1][j-1] + j,时空都是O(N^2),然后再天才的千方百计将空间复杂度下降到O(N),并添加一些提前结束计算循环的剪枝,再按照题目要求输出,才提交上去,果然AC了!只不过...


Kotlin提交

我真是天才,超越Kotlin100%的用户,但是感觉不太对劲啊,怎么花了差不多四秒才执行完,遂用Java重新写了一遍,提交上去,啊哦~
Java提交

我真是个弟弟,然后我就重新想,这道题的第I部分是前后夹击,但是这道题这样做不行,因为要求是连续和,不能前后计算,因为连续和为target的几个数(两个以上),最大的只能是target/2,所以就从target/2往前推,一开始设置尾指针tail为target/2,头指针head为target/2-1,长度len为2,和sum为head+tail,就开始下面的循环

  • sum为target,就将从head开始,包装出一个长度为len的步长为1的单增数组,并添加到答案,重点来了,因为从head到tail的和为target,那么,tail就肯定不能出现在长度len更长的其他答案里面(反证法,如果在,和就肯定比target大),tail就需要往前推,tail往前推了,head+tail肯定就小于target了,所以head也往前推,sum就比原来小了len那么多

  • sum比target大,那tail肯定要排除在后面的答案序列里面,举个例子,2+3+4比8要大,我们是从后往前的,如果不把4踢掉,那么连续序列肯定比(2+3+4)要长,肯定不符合答案,所以这种情况下前后指针都往前推,sum就比原来小了len那么多

  • sum比target小,这种情况只能head往前推,不能head和tail都往前推,因为head to tail比target小,都往前推的话还是比target小,没意义,只能通过增长序列来求解,所以这种情况head往前推,sum+=head,len++

ArrayList<int[]> ans = new ArrayList<>();
        int tail = (target % 2 == 0) ? target / 2 : target / 2 + 1;
        int head = tail - 1;
        int len = 2;
        int sum = tail + head;
        while(head != 0){
            if(sum == target){
                int[] tmp = new int[len];
                for (int i = 0; i < tmp.length; i++) {
                    tmp[i] = head + i;
                }
                ans.add(tmp);
                tail--;
                head--;
                sum -= len;
            }else if(sum > target){
                head--;
                tail--;
                sum -= 2;
            }else{
                head--;
                len++;
                sum += head;
            }
        }
        int[][] ret = new int[ans.size()][];
        for (int i = 0; i < ans.size(); i++) {
            ret[i] = ans.get(ans.size() - i - 1);
        }
        return ret;

代码文件,kotlin的为DP算法,Java为指针算法


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

推荐阅读更多精彩内容