和为S的两个数字(左右夹bi法)
2019-03-21 22:50
113 查看
版权声明:如需转载,请写明出处 https://blog.csdn.net/weixin_43113679/article/details/88728325
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
对应每个测试案例,输出两个数,小的先输出。
//看代码前先说明,它上面说的两个数的乘积最小不是所有的结果中乘积最小的, //我就入这个坑了,发现结果不一样,不是乘积最小的,用的左右夹bi法, //我感觉这题后面的输出应该改成相邻最近的 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){ return list; } int left =0; int right = array.length-1; while(left<right){ int total = array[left] +array[right]; //这一个是当逼近一个不能再逼近的临界点跳出,这时是相邻最近的, //不用担心有相同的数字,因为是递增排序 if(total==sum){ list.add(array[left]); list.add(array[right]); return list; }else if(total>sum){ //大于sum,说明太大了,right左移寻找更小的数 --right; }else{ //如果当前窗口内的值之和大于sum,那么左边窗口右移一下 ++left; } } return list; } }
相关文章推荐
- 码农小汪剑指Offer之40-和为S的两个数字(有序数组) 左右夹逼
- 读入N, S两个自然数(0<=S,N<=9),打印相应的数字三角形(其中,S表示确定三角形的第一个数,N表示三角形的行数)。(提示:左右对齐可使用cout<<left、cout<<right)
- 面试题41:和为s的两个数字VS和为s的连续正数序列
- 输入任意两个整数数字,计算这两个数字间能被3整除的数的和
- 用两个函数来实现求1到某个数字之间所有的素数并输出
- c语言中如何不使用加号,完成两个数字相加
- 数组中只出现一次的两个数字
- 数组中有两个出现一次的数字,其他数字都出现两次,找出这两个数字
- 创建两个文件,并将文件中对应的数字相加
- ViewPager实现左右两个屏幕的切换
- LeetCode题解--1. Two Sum(和为S的两个数字)
- 剑指offer之面试题41和为s的两个数字VS和为s的连续正数序列
- 链表实现两个数字相加
- php两个数字进行比较大小
- 有两个升序排列的数组A1和A2,给A1开辟的剩余内存有足够空间容纳A1,请实现一个函数,把A2中所有数字插入到A1中,并且是按照升序排列的
- 找出数组中两个只出现一次的数字 【微软面试100题 第六十一题】
- SQL字符串中取字母及数字的两个自定义函数(收藏)
- 九度OJ 1256:找出两个只出现了一次的数字 (位运算)
- 求两个大整数相乘的积,数字长度在127个字符之内。
- 比较两个有序数组中是否有相同数字