《剑指offer》——和为S的两个数字

来源:互联网 发布:空气湿度计算软件 编辑:程序博客网 时间:2024/05/22 19:50

T:

题目描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。

输出描述:
对应每个测试案例,输出两个数,小的先输出。

注意到数组有序,最基本的做法,那就是两层循环,挨个找,但是耗时,时间复杂度为O(n2)。既然数组有序,能不能利用“有序”的特性呢?

这里写图片描述

这里写图片描述

两者比较,始终以前面的pre指针为准,比K大,那就让后面的post指针一直往前退,知道退到某个元素xm,有:

xi+xm<K

当然,如果等于K,那就有pre ++; post –;同时进行。

还是回到上一个式子,既然小于K了,那就让pre往后走一格,变为xi+1。试想:既然有xi+xm+1>K,那么这种情况下,xi+1+xm+1更是大于K了,所以即使pre指针往后走了一格,xi变为了xi+1,post指针还是停在xm处。所以,这种情况下,时间复杂度是O(n)

code:

    import java.util.ArrayList;    import java.util.List;    /**     * T: 和为S的两个数字     *      * 题目描述      * 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,     * 如果有多对数字的和等于S,输出两个数的乘积最小的。      *       * 输出描述:      * 对应每个测试案例,输出两个数,小的先输出。     *      * date: 2015.11.26  17:07     * @author SSS     *     */    public class Solution {        public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {            ArrayList<Integer> result = new ArrayList<Integer>();            if (array == null) {                return result;            }            // 设定前后两个指针,从两端向中间走            int preIndex = 0;            int postIndex = array.length - 1;            while (preIndex < postIndex) {                int preNum = array[preIndex];                int postNum = array[postIndex];                // 大于的情况下,说明后面的指针所指向的值偏大,往前走一个长度,再试试                if (preNum + postNum > sum) {                    postIndex --;                } else if (preNum + postNum == sum) {                    if (result.size() == 0) {   // 碰到的第一个相等的就直接装进去                        result.add(preNum);                        result.add(postNum);                    } else {                        if (result.get(0) * result.get(1) > preNum * postNum) {                            result.remove(0);                            result.remove(0);                            result.add(preNum);                            result.add(postNum);                        }                    }                    // 因为两者相等,那么两个指针都要走一步                    preIndex ++;                    postIndex --;                } else {    //小于,preIndex就要往前走一步                    preIndex ++;                }            }            return result;        }    }
0 0
原创粉丝点击