牛客网——两数之和

时间复杂度:O(n^2),于每个元素,我们试图通过遍历数组的其余部分来寻找它所对应的目标元素,这将耗费O(n)的时间。因此时间复杂度为 O(n²)

空间复杂度:O(1),因为他没有用额外的空间,所以空间复杂度为1

方法二:倒推法(哈希Map记录法)

为了对运行时间复杂度进行优化,我们需要一种更有效的方法哈希表来检查数组中是否存在目标元素。如果存在,我们需要找出它的索引。

一个简单的实现使用了两次迭代。

  • 在第一次迭代中,我们将每个元素的值和它的索引添加到表中,map中的key对应数组中的数值,value对应数值的下标(索引)。

  • 在第二次迭代中,我们将检查每个元素所对应的目标元素(target -nums[i])是否存在于表中。注意,该目标元素不能是 nums[i] 本身!

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210407125308967.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3draDE4ODkxODQz 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 MTY1,size_16,color_FFFFFF,t_70)

代码实现

public int[] twoSum1(int[] numbers, int target) {

//使用map存储<元素值,索引位置>

Map<Integer, Integer> map = new HashMap<>();

for (int i = 0; i < numbers.length; i++) {

map.put(numbers[i], i);

}

for (int i = 0; i < numbers.length; i++) {

int cur = target - numbers[i];

//因为题目中说明,数组中的解是唯一的,所以就不存在下标相同,所以要加上map.get(cur) != i)

if (map.containsKey(cur) && map.get(cur) != i) {

return new int[]{i + 1, map.get(cur) + 1};

}

}

//如果找不到就返回-1,-1

return new int[]{-1,-1};

}

时间复杂度:O(n) 我们把包含有 n 个元素的列表遍历两次。由于哈希表将查找时间缩短到 O(1),所以时间复杂度为 O(n)

空间复杂度:O(n), 所需的额外空间取决于哈希表中存储的元素数量,该表中存储了 n 个元素

方法三:一次哈希法

在进行迭代并将元素插入到表中的同时,我们还会回过头来检查表中是否已经存在当前元素所对应的目标元素。

  • 如果它存在,那我们已经找到了对应解,并立即将其返回。

  • 如果不存在,那么就将他放入map中

在这里插入图片描述

代码实现

public int[] twoSum2(int[] numbers, int target){

Map<Integer,Integer> map = new HashMap<>();

//开始遍历

for (int i = 0; i < numbers.length; i++) {

int cur = target-numbers[i];

//一开始就查找map中是否存在cur,

if(map.containsKey(cur)){

//当存在时,直接返回

return new int[]{map.get(cur)+1,i+1};

}else {

//当不存在时,就将其放入map中

map.put(numbers[i],i);

}

}

//如果不存在则返回-1,-1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值