和为s的两个数字与和为s的连续正数序列

题目一:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。

分析:选择数组的两端,将其相加,然后与s比较,如果比s大,则将指向数组最后的向前移一位,如果小于s,则指向数组的第一位的向后移一位,然后继续这个过程。如果等于s,则输出这两个数。

实现:

bool FindNumbersWithSum(int data[],int length,int sum,int* num1,int* num2)
{
    bool found=false;
    if(length<1||num1==NULL||num2==NULL)
        return found;
    
    int ahead=length-1;
    int behind=0;
    
    while(ahead>behind)
    {
        long long curSum=data[ahead]+data[behind];
        if(curSUm==sum)
        {
            *num1=data[behind];
            *num2=data[ahead];
            found=true;
            break;
        }
        else if(curSum>sum)
            ahead--;
        else
            behind++;
    }
    return found;
}

题目二:输入一个正数s,打印出所有和为s的连续正数序列(至少两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1~5,4~6,7~8。

分析:设置两个数来表示序列的最小和最大值small和big,small为1,big为2,当small到big之间的序列和小于s时,big+1,如果大于s,则small+1,然后继续。如果相等,则输出序列。循环停止的条件是small增加到(1+s)/2. 实现:

void FindContinuousSequence(int sum)
{
    if(sum<3)
        return;
        
    int samll=1;
    int big=2;
    int middle=(1+sum)/2;
    int curSum=small+big;
    
    while(small<middle)
    {
        if(curSum==sum)
            PrintCountinuousSequence(small,big);
            
        while(curSum>sum&&small<middle)
        {
            curSum-=small;
            small++;
            if(curSum==sum)
                PrintCountinuousSequence(small,big);
        }
        big++;
        curSum+=big;
        
    }
}

void PrintContinuousSequence(int small,int big)
{
    for(int i=small;i<=big;++i)
        printf("%d  ",i);
        
    printf("\n");
}
时间: 2024-12-06 06:12:24

和为s的两个数字与和为s的连续正数序列的相关文章

[剑指Offer]41 和为S的两个数字 VS 和为S的连续正数序列

[剑指Offer]41 和为S的两个数字 VS 和为S的连续正数序列 Leetcode T1 Two Sum Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution, and you may not use the s

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

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

剑指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的两个数字,和为s的连续正数序列

1 和为s的两个数,利用begin,end两个位置标志和为s前后两个元素,当和大于s,end前移,和小于s,begin后移 vector<int> FindNumbersWithSum(vector<int> array,int sum) { 2 vector<int>res; 3 if(array.size()==0) 4 return res; 5 bool found=false; 6 int cursum=0; 7 int begin=0; 8 int end=

41.和为s的两个数字VS和为s的连续正数序列

bool FindNumbersWithSum(int data[], int length, int sum, int* num1, int* num2) { bool found = false; if (length < 1 || num1 == NULL || num2 == NULL) return found; int ahead = length - 1; int behind = 0; while (ahead > behind) { long long curSum = da

和为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的两个数VS和为S的连续正数序列

其实这个题目如果没有限制时间复杂度的话,那么就很简单了,一遍一遍地扫描吧.时间复杂度肯定就是 O(n2)啰.但是这题目肯定不会这么简单,否则就是小学生的水平了嘛. 其实我刚到这题的时候想到的是用二叉查找的方法进行.但是可能有点困难. 书上提供的方法固然是很巧妙的. 我们要抓住题目中数组的特点,是排好序的. 我们先定义两个指针.一个指头,一个指尾. 我们来计算start+end=16>15.于是知大了,咋办? 我们将end往后移一位.也就是如下了: 些时 1+11=12<15..咋办? 肯定是将

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

import java.util.*; public class Solution { public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) { if(sum < 0){ return null; } ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>()

[程序猿面试题精选100题]10.排序数组中和为给定值的两个数字

剑指Offer之和为S的两个数字 剑指Offer之和为S的连续正数序列 扩展(1):输入一个数组,推断这个数组中是不是存在三个数字i, j, k,满足i+j+k等于0. 扩展(2):假设输入的数组是没有排序的,但知道里面数字的范围,其它条件不变,怎样在O(n)时间里找到这两个数字?这个的基本思路是先用哈希表实现O(n)的排序(请參照本面试题系列的第57题).接下来的步骤都一样了.