题解 | #和为S的连续正数序列#

和为S的连续正数序列

http://www.nowcoder.com/practice/c451a3fd84b64cb19485dad758a55ebe

受到题解的启发,用前缀和先预处理一下,然后再结合前面写过的一个题:求和为目标值的两数下标 的思路,将sum+前缀和处理结果q[i]的值存入map,当下一个q[i]值在map内(记后一个i为j),就说明:q[j] = sum + q[i] -> q[j]-q[i] =sum 所以答案之一就是 j+1到i的区间之和
有一个坑就是map要初始化一个(sum,0)的值,不然从1开始加的那个序列会被丢掉~

import java.util.*;
public class Solution {
    public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
        ArrayList<ArrayList<Integer> > ans = new ArrayList<>();
        Map<Integer,Integer> map = new HashMap<>();
        int[] q = new int[sum];
        //存入0的初始值
        q[0] = 0;
        map.put(sum,0);
        //计算前缀和,对比q[i]是否存在,并同时把sum+前缀和的结果写进map
        for(int i=1;i<sum;i++){
            q[i] = q[i-1]+i;
            //存在对应值,即取之前的那个存在map的i值+1和目前的i值区间求和,就是答案之一
            if(map.containsKey(q[i])){
                int f = map.get(q[i]);
                ArrayList<Integer> ans1 = new ArrayList<>();
                for(int j = f+1;j<=i;j++){
                    ans1.add(j);
                }
                ans.add(ans1);
                map.put(sum+q[i],i);
                //不可能出现同一个数结尾的情况,所以可以把q[i]删了
                map.remove(q[i]);
            }else{
                map.put(sum+q[i],i);
            }
        }
        return ans;
    }
}    
全部评论

相关推荐

墨西哥大灰狼:如果你的校友卤馆还在的话,他肯定会给你建议的,可是卤馆注销了@ 程序员卤馆
点赞 评论 收藏
分享
牛客刘北:如果暑期实习是27届的话,你要晚一年才会毕业,企业为什么会等你呢?要搞清时间逻辑呀!27届现在实习只能是在暑假实习,这是日常实习,不是暑期实习。所以多去投日常实习吧,暑期实习肯定不会要你的
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-23 16:31
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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