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

      

  • 相关阅读:
    关于进程间通信
    ipc (进程间通信
    为什么需要进程间通信??
    重载、重写、覆盖
    conerstone代码回滚
    重载、重写、符号冲突、扩展
    UICollectionView(一)基本概念
    UICollectionViewFlowLayout & UICollectionViewDelegateFlowLayout
    UICollectionView框架总结
    UICollectionView
  • 原文地址:https://www.cnblogs.com/maohaitao/p/11281901.html
Copyright © 2011-2022 走看看