分析,两个数字的和为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,找出这两个数字的下标的更多相关文章

  1. 剑指offer40:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字

    1 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 2 思路和方法 (1)异或:除了有两个数字只出现了一次,其他数字都出现了两次.异或运算中,任 ...

  2. C语言:一个数组中只有两个数字是出现一次

    //1.一个数组中只有两个数字是出现一次, //其他所有数字都出现了两次. //找出这两个数字,编程实现.a //^=单独两个数的^结果 //单独出现的两个数不同位的标记 //position: ^结 ...

  3. 在一个数组中,除了两个数外,其余数都是两两成对出现,找出这两个数,要求时间复杂度O(n),空间复杂度O(1)

    题目:在一个数组中,除了两个数外,其余数都是两两成对出现,找出这两个数,要求时间复杂度O(n),空间复杂度O(1) 分析:这道题考察位操作:异或(^),按位与(&),移位操作(>> ...

  4. 【leetcode】Merge Sorted Array(合并两个有序数组到其中一个数组中)

    题目: Given two sorted integer arrays A and B, merge B into A as one sorted array. Note: You may assum ...

  5. Gym 101064 D Black Hills golden jewels 【二分套二分/给定一个序列,从序列中任意取两个数形成一个和,两个数不可相同,要求求出第k小的组合】

    D. Black Hills golden jewels time limit per test 2 seconds memory limit per test 256 megabytes input ...

  6. 【c语言】二维数组中的查找,杨氏矩阵在一个二维数组中,每行都依照从左到右的递增的顺序排序,输入这种一个数组和一个数,推断数组中是否包括这个数

    // 二维数组中的查找,杨氏矩阵在一个二维数组中.每行都依照从左到右的递增的顺序排序. // 每列都依照从上到下递增的顺序排序.请完毕一个函数,输入这种一个数组和一个数.推断数组中是否包括这个数 #i ...

  7. 作业帮:给定一个整数数组,找出其中两个数相加等于目标值(去重set)

    题目描述 给定一个整数数组,找出其中两个数相加等于目标值 输入 [1,3,5,7,9,11] 10 输出 1,9 3,7 代码: import java.util.HashMap; import ja ...

  8. 笔试题&amp;面试题:找出一个数组中第m小的值并输出

    题目:找出一个数组中第m小的值并输出. 代码: #include <stdio.h> int findm_min(int a[], int n, int m) //n代表数组长度,m代表找 ...

  9. C#实现如何判断一个数组中是否有重复的元素 返回一个数组升序排列后的位置信息--C#程序举例 求生欲很强的数据库 别跟我谈EF抵抗并发,敢问你到底会不会用EntityFramework

    C#实现如何判断一个数组中是否有重复的元素   如何判断一个数组中是否有重复的元素 实现判断数组中是否包含有重复的元素方法 这里用C#代码给出实例 方法一:可以新建一个hashtable利用hasht ...

  10. 位运算解决“一个数组中,只有一个数字出现n次,其他数字出现k次”问题

    转自:https://blog.csdn.net/monster_girl/article/details/52928864 在学习完位操作后,经常会遇到一类关于查找缺失整数的问题. 第一类是给你一个 ...

随机推荐

  1. 浅谈SFTP和FTP的区别

    一.适用场景 我们平时习惯了使用ftp来上传下载文件,尤其是很多Linux环境下,我们一般都会通过第三方的SSH工具连接到Linux,但是当我们需要传输文件到Linux服务器当中,很多人习惯用ftp来 ...

  2. PHP(Dom操作的一些基础)

    重点!! //DOM操作: // 核心思想:找到元素 操作元素// js找元素 会返回元素对象:// document.getElementById("dd");唯一确定// 返回 ...

  3. 解决mapper绑定异常:nested exception is org.apache.ibatis.binding.BindingException:

    原因: 此异常的原因是由于mapper接口编译后在同一个目录下没有找到mapper映射文件而出现的.由于maven工程在默认情况下src/main/java目录下的mapper文件是不发布到targe ...

  4. jar命令打jar包

    jar -cvfM0 cloudwarehouse-enter.jar ./BOOT-INF ./META-INF ./org jar -cvfM0 xxl-job-admin.war ./BOOT- ...

  5. WdatePicker日历添加事件,在任意月改变时处理日期事件

    原由 在做系统时根据要求有时候需要屏蔽掉某些特殊的日期,像周日或者法定假日,以及一些调班的日期:使用WdatePicker可以屏蔽掉周日和大多数法定假日,但像清明或者调班的日期则不好处理. 想法 1: ...

  6. java开发mis系统所需技术及其作用

    MIS(管理信息系统--Management Information System)系统 ,是一个由人.计算机及其他外围设备等组成的能进行信息的收集.传递.存贮.加工.维护和使用的系统. 是一门新兴的 ...

  7. 图->最短路径->多源最短路径(弗洛伊德算法Floyd)

    文字描述 求每一对顶点间的最短路径,可以每次以一个顶点为源点,重复执行迪杰斯特拉算法n次.这样,便可求得每一对顶点之间的最短路径.总的执行时间为n^3.但是还有另外一种求每一对顶点间最短路径的方法,就 ...

  8. js的字符串代码库及讲解

    1.字符串操作 1.1去除字符串空格 元字符 : \s:空格或者空白等 ^ : 限定开始位置 => 本身不占位置 $ : 限定结束位置 => 本身不占位置 | : 或者 () : 分组代表 ...

  9. 3.1.1 Spring 简介

    1. 概念 Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架. IoC : Inversion of Control AOP : Aspect Oriented Program ...

  10. Ch05 类 - 练习

    1. 改进5.1节的Counter类,让它不要在Int.MaxValue是变成负数. class Counter{     private var value = Int.MaxValue     d ...