LeetCode算法题第一题
2020-02-02 14:30
1011 查看
题目:两数之和
给定一个整数数组 nums和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
- 示例
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
方法一:暴力法(自己写的方法)
class Solution { public int[] twoSum(int[] nums, int target) { for(int i = 0;i<nums.length-1;i++){ for(int j = i+1;j<nums.length;j++){ if(nums[i]+nums[j] == target){ return new int[] {i,j}; } } } thrown new IllegalArgumentException("No two sum solultion!"); } } /*遇到的语法问题: *数组定义下标时,下标的定义应该在new int[下标值]这个位置,在前面定义时非法的会报错 */
输出结果:
输入[2,7,11,15],9 输出[0,1] 预期结果[0,1]
复杂度分析:
- 时间复杂度: O(n2)
对于每个元素,我们试图通过遍历数组的其余部分来寻找它对应的目标元素,这将耗费O(n)的时间。因此时间复杂度为O(n2) - 空间复杂度: O(1)
方法二:遍历两遍Map哈希表
为了对运行时间复杂度进行优化,我们需要一种更有效的方法来检查数组中是否存在目标元素。如果存在,我们需要找出它的索引。保持数组中的每个元素与其索引相互对应的最好方法是什么?哈希表。
通过以空间换取速度的方式,我们可以将查找时间从 O(n)O(n) 降低到 O(1)O(1)。哈希表正是为此目的而构建的,它支持以 近似 恒定的时间进行快速查找。我用“近似”来描述,是因为一旦出现冲突,查找用时可能会退化到 O(n)O(n)。但只要你仔细地挑选哈希函数,在哈希表中进行查找的用时应当被摊销为 O(1)O(1)。
一个简单的实现使用了两次迭代。在第一次迭代中,我们将每个元素的值和它的索引添加到表中。然后,在第二次迭代中,我们将检查每个元素所对应的目标元素(target - nums[i]target−nums[i])是否存在于表中。注意,该目标元素不能是 nums[i]nums[i] 本身!
class Solution { public int[] twoSum(int[] nums, int target) { Map<Integer,Integer> map = new HashMap<>(); for(int i = 0; i<nums.length; i++){ map.put(nums[i],i); } for(int i = 0;i<nums.length;i++){ int complement = target - nums[i]; if(map.containsKey(complement) && map.get(complement) != i){ return new int[] {i,map.get(complement)}; } } throw new IllegalArgumentException("No two sum solution!"); } }
复杂度分析:
- 时间复杂度:O(n),
我们把包含有n个元素的列表遍历两次。由于哈希表将查找时间缩短到O(1),所以时间复杂度为O(n)。 - 空间复杂度:O(n)
所需的额外空间取决于哈希表中存储的元素数量,该表中存储了n个元素。
输出结果:同上。
方法三: 一遍哈希表
事实证明,我们可以一次完成。在进行迭代并将元素插入到表中的同时,我们还会回过头来检查表中是否已经存在当前元素所对应的目标元素。如果它存在,那我们已经找到了对应解,并立即将其返回。
class Solution { public int[] twoSum(int[] nums, int target) { Map<Integer,Integer> map = new HashMap<>(); for(int i = 0; i < nums.length; i++){ int complement = target - nums[i]; if(map.containsKey(complement)){ return new int[] {i, map.get(complement)}; } map.put(nums[i],i); } throw new IllegalArgumentException("No two sum solution!"); } }
复杂度分析:
- 时间复杂度: O(n),
我们只遍历了包含有n个元素的列表一次,在表中进行的每次查找只花费O(1)的时间。 - 空间复杂度:O(n),
所需的额外空间取决于哈希表中存储的元素数量,该表最多需要存储n个元素。
输出结果:同上。
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- iOS开发教程:Storyboard全解析-第一部分02
- PHP第一阶段
- 黑马程序员--第一阶段3.面向对象--第8天
- 第一冲刺阶段第七天
- 黑马程序员--第一阶段5.JavaAPI--第16天
- CodeM资格赛第一题
- 数学之美系列 二十三 输入一个汉字需要敲多少个键 — 谈谈香农第一定律
- 安卓逆向之华山杯ctf第一题:错错错
- 数字串前第一小比它小的数
- 地理学(第一、第二)定律
- 2012年Q1全球:PC份额惠普第一 移动PC份额苹果第一
- leetcode第一刷_Minimum Depth of Binary Tree
- 提高班第一阶段的主要问题和启示
- 数据库(第一,第二,第三范式)
- 最好的返利网,第一返利网,最好的,不骗人的,可信的返利网
- 水题 第一站 关于521
- 郎咸平:中国人正上的四个大当 房产排第一
- Java第一阶段-Java基础入门
- 联想杨元庆自掏近两千万奖员工,联想PC年内或超惠普成全球第一
- 全球最权威人脸识别测试,中国团队依图科技夺得第一