题目描述: 题目一:输入一个递增排序的数组和一个数字 s,在数组中查找两个数,得它们的和正好是 s。如果有多对数字的和等于 s,输出任意一对即可。 题目二:输入一个正数 s,打印出所有和为 s 的连续正数序列(至少两个数)。

i c } m l p a o s r s f } f } f } t u u u F n n n F o c c c o r v v w } p i } v v l v w } p f } p u 4 s a a h r s f a a e a / h r f o r n 1 u r r i i u r r t r i i o r i d S m l n m k l n r n a o I l r e i } } } t s r s b m s e i } w } s s t K i p t t l s e i f e e ( I < e m i i u 2 f h u m ( P r ( i u K f g l l " s t a g d m s i m a " r i i " o t ( t h l n s s n K 3 u l s m s l s l i i n n o n i _ t e u p r e r e l o S r l = = a u f e b s i } l s n t n o = f m r e i e q { n = l m o i u f - t s ( c n n = t s i t i g { f r e = 2 ( l s r s g m = + a ( m i e u 0 [ n u f h t e u 1 s K m s s = l _ a ) ! { m n < r t r t s e 1 m < = P a + u f s l l " s u i ( n n + u n + a = r l = + m o m 1 ! s l ) : m r g " u - = l c l m i l = s r a " m . s i h \ m = t e k l i k n 1 K l ) a . [ . g t ( s 1 ! ( ) d t < b = P l l < I c h ] n [ 1 " _ / + { ( i = r l b n o t u r ) 2 { s m g i : i t u + m i k b m i k n g ] n { s g : i a d t I + , t n [ h g l { ( n 1 _ u r t I l & s t - m i ] n , & m , { k s g t a _ : 1 [ h + ) b s l l t i u l b I e ] n { g m , i n f ) u ) s g t t + m b : ) ] \ s < i ( [ g I { = n l k ) n = u e t m f { ) k s t [ ] { { l e > f t k ] ) { = \ ( k ) " )

算法思想: 题目一:我们先在数组中选择两个数字,如果它们的和等于输入的 s,我们就找到了要找的两个数字。如果和小于 s 呢?我们希望两个数字的和再大一点。由于数组已经排好序了,我们可以考虑选择较小的数字后面的数字。因为排在后面的数字要大一些,那么两个数字的和也要大一些, 就有可能等于输入的数字 s 了。同样, 当两个数字的和大于输入的数字的时候,我们可以选择较大数字前面的数字,因为排在数组前面的数字要小一些。 题目二:考虑用两个数 small 和 big 分别表示序列的最小值和最大值。首先把 small 初始化为 1,big 初始化为 2。如果从 small 到 big 的序列的和大于 s,我们可以从序列中去掉较小的值,也就是增大 small 的值。如果从 small 到 big 的序列的和小于 s,我们可以增大 big,让这个序列包含更多的数字。因为这个序列至少要有两个数字,我们一直增加 small 到(1+s)/2 为止。

这类题有个共性,就是两个指针,一前一后。

github地址:https://github.com/cubegao/LeetCode