【LeetCode】1.两数之和

1.两数之和

知识点:数组,哈希表

题目描述

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例
输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 输入:nums = [3,2,4], target = 6 输出:[1,2] 输入:nums = [3,3], target = 6 输出:[0,1]

解法一:暴力法

直接进行两边数组的遍历;

class Solution { public int[] twoSum(int[] nums, int target) { int[] ans = new int[2]; for (int i = 0; i < nums.length-1; i++){ for(int j = i + 1; j < nums.length; j++){ if (nums[i] + nums[j] == target){ ans[0] = i; ans[1] = j; return ans; } } } return null; } }

时间复杂度:O(N^2);

解法二:哈希表

仔细想一下,我们上面的开销主要在于寻找target-nums[i]这个过程,这个过程需要将整个数组遍历;哈希表的话在寻找值的时候复杂度是O(1);所以可以用哈希表存起来,然后再在哈希表里查找;

class Solution { public int[] twoSum(int[] nums, int target) { HashMap<Integer,Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++){ //检验是否存在期望的值;存在直接返回;这个过程的复杂度是O(1); //notes:以后刷题不要新建数组,直接在最后的返回时匿名对象就可以了; if (map.containsKey(target - nums[i])) return new int[]{map.get(target - nums[i]), i}; //不存在加入到哈希表中; else map.put(nums[i], i); } return null; } }

时间复杂度:O(N);
空间复杂度:O(N);哈希表的开销;
-python

class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: hashtable = {} for i in range(len(nums)): if target-nums[i] in hashtable: return [i,hashtable[target-nums[i]]] hashtable[nums[i]] = i return None

体会

其实我们经常会用到哈希表的containsKey()的这个方法;因为它的检索时间复杂度为常数;


__EOF__

本文作者Curryxin
本文链接https://www.cnblogs.com/Curryxin/p/15004061.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Curryxin  阅读(73)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
Live2D
欢迎阅读『【LeetCode】1.两数之和』
点击右上角即可分享
微信分享提示