剑指Offer对答如流系列 - 和为s的数字
文章目录 面试题57:和为s的数字 一、题目描述 二、问题分析 三、问题解答 面试题57:和为s的数字 一、题目描述 问题(1)和为s的两个数字 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。 问题(2)为s的连续正数序列 输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1~5、4~6和7~8。 二、问题分析 问题(1) 考虑到数列递增,我们设置两个头尾两个索引i和j, 若ai + aj == sum,就是答案(相差越远乘积越小) 若ai + aj > sum,aj肯定不是答案之一(前面已得出 i 前面的数已是不可能),j -= 1 若ai + aj < sum,ai肯定不是答案之一(前面已得出 j 后面的数已是不可能),i += 1 由于是从两边往中间移动,所以不会有跳过的情况,时间复杂度为O(n)。 问题(2) 顺着问题(1)的思路来就是 当从i到j的序列的和小于sum时,增加j,使序列包含更多数字;(记得更新序列之和) 当从i到j的序列的和大于sum时,减少i,使序列去掉较小的数字;(记得更新序列之和) 当从i到j的序列的和等于sum时,此时得到一个满足题目要求的序列,输出,然后继续将i增大