剑指offer--第57题 和为s的数字

第57题 和为s的数字

题目 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
思路 首先应该都会想到用双层for循环的思路遍历数组来查找,但是这样的时间复杂度高。可以采用首尾同时进行,定义两个指针标志。具体过程可以见下面的例子。

自己写的Low代码

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
         ArrayList<Integer> list = new ArrayList<Integer>();
        if(array==null||array.length==0||sum<array[0]) {
        	return list;
        }
        //如果存在的话
        for(int i=0;i<array.length;i++) {
        	for(int j = i+1;j<array.length;j++) {
        		if(array[i]+array[j]==sum) {
        			list.add(array[i]);
        			list.add(array[j]);
        			return list;
        		}
        		
        		if(array[i]+array[j]>sum) {
        			break;
        		}
        	}
        	
        }
        return list;
    }
}

根据剑指Offer提供的思路

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
          ArrayList<Integer> list = new ArrayList<Integer>();
    if(array==null||array.length==0||sum<array[0]) {
    	return list;
    }
   int i=0;
   int j=array.length-1;
   //两边同时进行;
   while(i<j) {
	   if(array[i]+array[j]==sum) {
			list.add(array[i]);
			list.add(array[j]);
			return list;
		}else if(array[i]+array[j]<sum) {
		   i++;
	   }else {
		   j--;
	   }
   }
    return list;
    }
}

主要区别在于时间复杂度上,两边同时进行的思路很妙。

posted @ 2018-07-11 00:45  LynnMin  阅读(163)  评论(0编辑  收藏  举报