zoukankan      html  css  js  c++  java
  • 剑指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;
        }
    }
    

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

    多思考,多尝试。
  • 相关阅读:
    HUD 问题
    嵌入式面试
    网上某人面试经验总结
    C中prngtf是从右到左压栈的
    哈希表
    做事原则
    学习单片机的步骤
    C#预处理器命令
    CWinApp类CMultiDocTemplate类CDocument类CView类的关系
    Windows消息大全
  • 原文地址:https://www.cnblogs.com/LynnMin/p/9292211.html
Copyright © 2011-2022 走看看