Kohath

Java程序员

LeetCode 两数之和

LeetCode-两数之和

给一个整数数组,找到两个数使得他们的和等于 一个给定的数目标

你需要实现的函数twoSum需要返回这两个数的下标,并且第一个下标小于第二个下标。注意这里下标的范围是1到  n,不是以  0 开头。

样例:

给出numbers =  [2, 7, 11, 15],target =  9,返回  [1, 2]

两层for循环

 public  int[] sort(int num[],int target){
         int i,j;
         int result[]={0,0};
         for (i = 0;i<num.length;i++){
             for (j=1;j<num.length;j++) {
                 if (i > target || j > target)
                     continue;
                 if (num[i] + num[j] == target) {
                     result[0] = i;
                     result[1]=j;
                 }
             }
         }
         return result;
}

这样的算法时间复杂度为O(n²)

我们知道对元素的搜索最快则是O(1)O(1),即直接索引到,联想只能是Hash表或者是关键字索引。关键字索引(从最小到最大)会占用额外的内存空间。 

采用Hash表,建立索引

思路:1. num1 +num2 = target

          2. num1 和num2 都是一个数组的数

        也就是说,如果我们用target - num1 得到一个新数组,这个新数组中包含num2 则找到匹配值

实现:采用hash表 key为target-num1 ,value存放num1的数组下标。

 public  int[] sort(int num[],int target){
       int [] i ={0,0};
         Map <Integer,Integer> map = new HashMap<>();
         for (int j=0;j<num.length;j++){
             if(map.containsKey(num[j])){
                 i[0] = map.get(num[j]);  //num1的下标
                 i[1] = j; // num2的下标
             }
             map.put(target - num[j],j);
         }
         return i;
    }
时间复杂度为O(n)
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34966247/article/details/79973124
文章标签: Java
个人分类: 算法
下一篇Java中的大数相加
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭