• 一个数组中两个数的和为N,找出这两个数字的下标


    分析,两个数字的和为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]);
    
  • 相关阅读:
    20201231《信息安全专业导论》第一周学习总结
    Python模拟进程状态
    Python gui
    2020-2021-1 20201208《信息安全专业导论》第10周学习总结
    2020-2021-1 20201208 《信息安全专业导论》第九周学习总结
    熟悉编程语言
    俄罗斯方块
    小学四则运算编程实践
    2020-2021-1-1 《信息安全专业导论》第八周学习总结
    2020-2021-1 20201208 《信息安全专业导论》第七周学习总结
  • 原文地址:https://www.cnblogs.com/cristin/p/9277123.html
Copyright © 2020-2023  润新知