和为S的连续正数序列(剑指offer) 两个个指针的应用

和为S的连续正数序列

  • 参与人数:1005时间限制:1秒空间限制:32768K
  • 通过比例:26.06%
  • 最佳记录:0 ms|0K(来自  平方宁

题目描述

小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!

输出描述:
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序

链接:http://www.nowcoder.com/practice/c451a3fd84b64cb19485dad758a55ebe?rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

思路:和前面题意一样,用两个指针来控制区间段,小了,后的指针往后移动;大了,前指针后移;

#include<cstdio>
#include<vector>
using namespace std;

class Solution {
public:
    vector<vector<int> > FindContinuousSequence(int sum) {
        int start=1,end=2;
        vector<vector<int> >arr;

        if(sum<start+end) return arr;
        int tmp=start+end;
        while(start+end<sum||end-start==1)
        {
//            printf("start=%d\tend=%d\n",start,end);
            if(tmp<=sum)
            {
                if(tmp==sum)
                {
                    int i=start;
                    int j=end;
                    vector<int> vec;
                    while(i<=j)
                    {
                        vec.push_back(i++);
                    }
                    arr.push_back(vec);
                }
                end++;
                tmp+=end;
            }
            else
            {
                tmp-=start;
                start++;
            }
        }
        return arr;
    }
};
int main()
{
    int n;
    Solution so;
    while(~scanf("%d",&n))
    {
        vector<vector<int> >arr=so.FindContinuousSequence(n);
        for(int i=0;i<arr.size();i++)
        {
            for(int j=0;j<arr[i].size();j++)
            {
                printf("%d ",arr[i][j]);
            }
            printf("\n");
        }
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-25 14:18:44

和为S的连续正数序列(剑指offer) 两个个指针的应用的相关文章

和为S的连续正数序列-剑指Offer

和为S的连续正数序列 题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22.现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck! 输出描述 输出所有和为S的连续正数序列.序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序 思路 设置一个smal

栈的压入、弹出序列-剑指Offer

栈的压入.弹出序列 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列. 思路 需要一个辅助栈 如果下一个弹出栈的数字刚好是栈顶数字,那么直接弹出.若不是,把压栈序列中没有入栈的的数字压入辅助栈,直到把下一个需要弹出的数字压入栈顶为止.若所有数字都压入栈仍然没有找到下一个弹出的

二叉搜索树的后序遍历序列-剑指Offer

二叉搜索树的后序遍历序列 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 思路 后序遍历:左-->右-->根节点 二叉搜索树中,左子树的节点小于根节点,右子树的节点大于根节点 递归调用,根据大小区别左右子树,若在右子树中发现小于根节点的节点,就不是后续遍历序列 举一反三:如果要求处理一棵二叉树的遍历序列,我们可以先找到二叉树的根节点,再基于根节点把整棵树的遍历序列拆分成左子树对应的子序列和右子

剑指Offer - 两个链表第一个公共节点

https://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?tpId=13&tqId=11189&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述 输入两个链表,找出它们的第一个公共结点. 代码: 注意:没有检测环状链表. /* struct ListNode { int

剑指offer——两个链表的公共节点

题目链接:输入两个链表,找出它们的第一个公共结点. 解题思路: 找出2个链表的长度,然后让长的先走两个链表的长度差,然后再一起走(因为2个链表用公共的尾部) 1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 } 9 }*/ 10 public class Solution { 11 public ListNode FindFir

剑指Offer--041-和为S的连续正数序列

链接 牛客OJ:和为S的连续正数序列 九度OJ:http://ac.jobdu.com/problem.php?pid=1354 GitHub代码: 041-和为S的连续正数序列 CSDN题解:剑指Offer–041-和为S的连续正数序列 牛客OJ 九度OJ CSDN题解 GitHub代码 041-和为S的连续正数序列 1354-和为S的连续正数序列 剑指Offer–041-和为S的连续正数序列 041-和为S的连续正数序列 题意 题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~

《剑指offer》题解

有段时间准备找工作,囫囵吞枣地做了<剑指offer>提供的编程习题,下面是题解收集. 当初没写目录真是个坏习惯(-_-)||,自己写的东西都要到处找. 剑指Offer - 九度1524 - 复杂链表的复制 剑指Offer - 九度1509 - 树中两个结点的最低公共祖先 剑指Offer - 九度1508 - 把字符串转换成整数 剑指Offer - 九度1504 - 把数组排成最小的数 剑指Offer - 九度1503 - 二叉搜索树与双向链表 剑指Offer - 九度1390 - 矩形覆盖 剑

剑指Offer面试题41(Java版):和为s的两个数字VS和为s的连续正数序列

题目一:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s.如果有多个数字的和等于s,输出任意一对即可. 例如输入数组{1,2,4,7,11,15}和数字15.由于4+11=15,因此输出4和11. 在面试的时候,很重要的一点是应聘者要表现出很快的反应能力.只要想到一个办法,应聘者就可以立马告诉面试官,即使这个办法不一定是最好的.比如这个问题,很多人会立即能想到O(n2)的方法,也就是先在数组中固定一个数字,再依次判断数组中其余n-1个数字与它的和是不是等于s.面试官会

和为S的两个数字VS和为S的连续正数序列

题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s.如果有多对数字的和等于s,输出任意一对即可. 思路:最初我们找到数组的第一个数字和最后一个数字.首先定义两个指针,第一个指针指向数组的第一个(也就是最小的)数字,第二个指针指向数组的最后一个(也就是最大的)数字.当两个数字的和大于输入的数字时,把较大的数字往前移动:当两个数字的和小于数字时,把较小的数字往后移动:当相等时,打完收工.这样扫描的顺序是从数组的两端向数组的中间扫描. #include "stdafx.