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

    题目描述

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

    输出描述:

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

    方法一:使用set保存访问过得结点,新结点array[i]判断sum-array[i]是否在set中,时间复杂度为O(n),但是这种方法求得的是乘积最大值,不符合题意。
    方法二:当前结点array[i],从后往前循环数组判断sum-array[i]是否存在,时间复杂度为O(n2)。若查找sum-array[i]使用二分优化,时间复杂度为O(nlogn).

     1 public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {//my
     2         ArrayList<Integer> re = new ArrayList<Integer>();
     3         for(int i=0;i<array.length;i++){
     4             int y = sum-array[i];
     5             for(int j =array.length-1;j>i;j--){
     6                 if(array[j]==y){
     7                     re.add(array[i]);
     8                     re.add(y);
     9                     return re;
    10                 }
    11             }
    12         }
    13         return re;
    14     }

    方法三:头尾指针,从两边往中间夹,时间复杂度为O(n)

     1 public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {//mytip
     2         ArrayList<Integer> re = new ArrayList<Integer>();
     3         int i=0;
     4         int j=array.length-1;
     5         while(i<j){
     6             if(array[i]+array[j]==sum){
     7                 re.add(array[i]);
     8                 re.add(array[j]);
     9                 break;
    10             }
    11             else if(array[i]+array[j]>sum){
    12                 j--;
    13             }
    14             else{
    15                 i++;
    16             }
    17         }
    18         return re;
    19     }

    相关题

    LeetCode1 两数之和 https://www.cnblogs.com/zhacai/p/10429120.html

  • 相关阅读:
    《互联网时代》第三集·能量
    《互联网时代》第二集·浪潮
    java 基础类库之 SysFun
    java 基础类库之 SQLFun
    java 基础类库之 FormatFun
    Java 之 JDBC
    WepE
    MySql学习笔记
    Oracle学习笔记——点滴汇总
    Linux学习笔记——基于鸟哥的Linux私房菜
  • 原文地址:https://www.cnblogs.com/zhacai/p/10696698.html
Copyright © 2011-2022 走看看