剑指Offer--我用JAVA做(一)
来源:互联网 发布:狙击手 特别行动 知乎 编辑:程序博客网 时间:2024/06/06 05:10
/** * 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 *输入: 每个测试案例包括两行: 第一行包含一个整数n和k,n表示数组中的元素个数,k表示两数之和。其中1 <= n <= 10^6,k为int 第二行包含n个整数,每个数组均为int类型。 *输出: 对应每个测试案例,输出两个数,小的先输出。如果找不到,则输出“-1 -1” *样例输入: 6 15 1 2 4 7 11 15 *样例输出: 4 11 * @author zonebase@163.com */public class day01 { public static void main(String[] args) { int[] testData={1,2,4,7,11,15}; int sum =15; Map result=solution(testData,sum); for(Object key:result.keySet()){ System.out.println(key+" "+ result.get(key)); } } private static Map solution(int[] array,int sum){ Map<Integer,Integer> result=new HashMap<Integer,Integer>(); result.put(-1, -1); if(array==null||array.length<2){ return result; } int begin=0,end=array.length-1; /** * 此处可能会纠结的一个问题是:如果有多对数字的和等于S,输出两个数的乘积最小的; * 但仔细一想,当a+b = c时,ab<=(a+b)的平方/4,当且仅当a==b时,ab取得最大值,二者相差越远,乘积越小。 * 所以只需要求出相距最远的两个满足条件的即可。 */ while(begin<end){ if(array[begin]+array[end]==sum){ result.remove(-1, -1); result.put(array[begin], array[end]); return result; }else if(array[begin]+array[end]<sum){ begin++; }else{ end--; } } return result; } }
0 0
- 剑指Offer--我用JAVA做(一)
- 剑指Offer--我用JAVA做(二)
- 剑指Offer--我用JAVA做(三)
- 剑指Offer:不用加减乘除做加法(一刷)
- 《剑指Offer》做题总结(一)
- 我用Unity3d做游戏(一)
- 我用Python做设计(一)
- 剑指Offer笔记<JAVA版>(一)
- 剑指offer习题JAVA实现(一)
- 剑指offer 练习一(Java版)
- 剑指offer:不用加减乘除做加法(java)
- 【Java】我做笔试题遇到的问题(一)
- 剑指offer(一)
- 剑指offer(一)
- 剑指Offer题目JAVA版思路与代码(一)
- 我做老大的日子(一)
- 剑指offer编程总结(Java实现)(一)
- 剑指offer笔记(一)
- 栈和栈帧
- 关于group by 两个或以上条件的分析
- 【LeetCode】461. Hamming Distance (java实现)
- 虚拟内存的理解
- DP (3) -- Count Numbers with Unique Digits,Decode Ways,Unique Binary Search Trees I, II
- 剑指Offer--我用JAVA做(一)
- impala用parquet格式,hive用orc格式
- 微信小程序简单教程(一)
- C#中基于GDI+(Graphics)图像处理系列之任意角度旋转图像
- Stetho工具介绍
- 第2.1.10章 WEB系统最佳实践Spring文件配置多数据源
- 在Mac OS X上安装PostgreSQL
- java基础文件操作
- [leetcode][81] Search in Rotated Sorted Array II