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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值