zoukankan      html  css  js  c++  java
  • 箭指offer:和为S的两个数字

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

    思路1:从数组两端向中间查找满足条件的两个数

        开始还在纠结乘积最小,后来转念一想,a+b=sum,a和b越远乘积越小,而一头一尾两个指针往内靠近的方法找到的就是乘积最小的情况。

                  如果是乘积最大的情况就是一直找到两个指针重合,每次找到一个就将之前返回的结果向量清空然后更新为新找到的。

           i和j表示数组两端下标
           当array[i]+array[j]>S时,j-- 尾端向前移动,两数据和增大
            当array[i]+array[j]=S时,将array[i],array[j]依次添加到ArrayList中,
           当array[i]+array[j]<S时,i++前段向后移动,两数据和减小
         

    代码:

    import java.util.ArrayList;
    public class Solution {
        public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
            ArrayList<Integer> list = new ArrayList<Integer>();
            int left = 0;
            int right = array.length-1;
            while(left < right){
                int num = array[left] + array[right];
                if(num == sum){
                    list.add(array[left]);
                    list.add(array[right]);
                    return list;
                }else if(num < sum){
                    left++;
                }else{
                    right--;
                }
            }
            return list;
        }
    }
    

      运行时间:17ms

      占用内存:9288k

    思路2:用HashMap存放元素和下标,然后开始遍历数组找到和为sum的两个元素,从左到右找到的第一对和为sum的就是最小的一对。

    import java.util.ArrayList;
    import java.util.HashMap;
    public class Solution {
        public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
            HashMap map = new HashMap();
            ArrayList<Integer> result = new ArrayList();
            int len = array.length;
            for (int i = 0; i < len; i++) {
                map.put(array[i], i);
            }
            for (int i = 0; i < len; i++) {
                int sub = sum - array[i];
                if (map.containsKey(sub)) {
                    result.add(array[i]);
                    result.add(sub);
                    break;
                }
            }
            return result;
        }
    }
    

      运行时间:14ms

           占用 内存:9276k

      

  • 相关阅读:
    兄弟连新版ThinkPHP视频教程2.ThinkPHP 3.1.2 MVC模式和URL访问
    兄弟连新版ThinkPHP视频教程1.ThinkPHP 3.1.2 介绍及安装
    【算法】高效计算n的m次方
    linux下解压.zip压缩包出现乱码的问题解决
    马哥linux笔记--重定向
    JavaScript的基本知识
    repeater做删除前弹窗询问
    网页中图片路径错误时显示默认图片方法
    添加分页
    javascript类型转换
  • 原文地址:https://www.cnblogs.com/maohaitao/p/11281901.html
Copyright © 2011-2022 走看看