一个数组中两个数的和为N,找出这两个数字的下标
来源:互联网 发布:淘宝直通车图片优化 编辑:程序博客网 时间:2024/05/18 03:33
因为最近用的是java就按java写了。
话说最近才发现原来java面试时候居然可以用库里的函数。
分析,两个数字的和为N。那么这两个数字是否是唯一的呢?输出的下标是否是第一对出现的呢?
1,我们假设这两个数字是唯一的
和是唯一的,那么其中一个数字越大,另一个数字就越小。想到大小关系,我们就想到了排序。那么首先排序:
int array[]={ 1, 2, 7, 9, 13, 57, 36, 26, 55, 11, 9, 6, 3, 89, 36, 75, 36, 76, 95, 98, 101, 320, 520, 85, 36, 62, 49, 96, 1 };
因为要返回原始下标,所以要进行记录
int array1[]=array.clone();//这种记录最完善,但是查询不方便
Map<Integer,Integer> hs=new HashMap<Integer,Integer>();//这种方法没有顺序性只能查到原始下标但不能确定顺序,查询方便
Arrays.sort(array); 平均时间复杂度o(nlogn)
然后最小的加上最大的,如果大于n,证明大的太大了,就尝试第二大的数字。如果小于n就证明小的太小了,就尝试第二小的数字。
代码如下:
while((addAns=array[i]+array[j]-N)!=0&&i<j){
if(addAns>0){
j--;
}else{
i++;
}
}
if(i==j){
System.out.println("没有结果");
return;
}
这样array[i]和array[j]就是所求的两个数字。
再通过hs.get(array[i]) 和hs.get(array[j])就得到了这两个数字的原始下标输出即可。但由于缺乏顺序性,这两个下标可能不是第一个出现的。
通过遍历数组的方式可以找到第一组数字。
完整代码:
int array[]={ 1, 2, 7, 9, 13, 57, 36, 26, 55, 11, 9, 6, 3, 89, 36, 75, 36, 76, 95, 98, 101, 320, 520, 85, 36, 62, 49, 96, 1 };
int array1[]=array.clone();
Map<Integer,Integer> hs=new HashMap<Integer,Integer>();
for (int i = 0; i < array.length; i++) {
hs.put(array[i], i);
}
Arrays.sort(array);
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]+",");
}
System.out.println();
for (int i = 0; i < array.length; i++) {
System.out.print(array1[i]+",");
}
System.out.println();
int N = 35,s1=-1,s2=-1,i=0,j=array.length-1;
int addAns;
//比较,如果addAns>0表示 时间复杂度o(n)
while((addAns=array[i]+array[j]-N)!=0&&i<j){
if(addAns>0){
j--;
}else{
i++;
}
}
if(i==j){
System.out.println("没有结果");
return;
}
//找到其中一组下标
System.out.println("any one: "+hs.get(array[i]) + ":" + array[i] + "+" + hs.get(array[j]) + ":" + array[j]);
//找到第一组下标 时间复杂度o(n)
for(int k=0;k<array1.length-1;k++){
if(array1[k]==array[i]&&s1<0){
s1=k;
}
if(array1[k]==array[j]&&s2<0){
s2=k;
}
if(s1>=0&&s2>=0)
{
break;
}
}
System.out.println("first one: "+s1 + ":" + array[i] + "+" + s2 + ":" + array[j]);
- 一个数组中两个数的和为N,找出这两个数字的下标
- 面试算法题:数组中两个数之和为定值,找出这对数的下标
- 两数之和二 给定一个整形的数组,找出其中的两个数使其和为某个指定的值,并返回这两个数的下标(数组下标是从0开始)。假设数组元素的值各不相同,则要求时间复杂度O(n),n为数组的长度
- 【查找】在按照绝对值排序的数组中,找出和为k的两个数的下标
- 从一个数据元素无序的整型数组中找出最小的两个数的下标
- 无序数组中找出和为N的两个数 Two Sum
- 数组中两个数之和等于某个数字,返回这两个数的下标
- 剑指offer中在一个有序数组中找出和为s的两个数字
- 一个数组中只有两个数字单独出现,其余数字都是成对出现的,请找出这两个数。
- 输入一个递增排序的数组和一个数字s,在数组中寻找两个数,使得这两个数的和为s
- 找出数组中两个数之和为指定的数
- 1. Two Sum 给定一个数组和一个数,输出两个和为给定数的数组元素的下标
- 一个数组中,存在两个只出现一次的数字,其余的数字均出现两次。要求在时间复杂度o(n),空间复杂度为o(1)的情况下找出这两个数字
- 找出一个数组中只出现一次的两个数
- 一个数组中只有两个数字是出现一次的,其他数字都是成对出现,找出这两个数字
- 找出和为S的两个数字
- 电面:给一个数组找出和为k的两个数
- 一个有序数组中找出两个数,使得两个数的和等于X的C++实现源代码
- MessageBox用法大全
- POJ 3206 Borg Maze(bfs+prim)
- 区别call() 和 .apply()
- C# 中闭包问题
- [第三步]homebridge添加yeelight插件支持彩色灯控制以及亮度调节
- 一个数组中两个数的和为N,找出这两个数字的下标
- iOS10 权限崩溃问题
- Socket、Tcp、Udp、Http 的认识及区别
- Kafka设计解析(二)- Kafka High Availability (上)
- 1020. Tree Traversals (25)
- kibana 使用 (1)
- eclipse连接远程hadoop集群开发时权限不足问题解决方案
- 数据库的垂直划分和水平划分
- 深度学习框架mxnet安装与使用