算法实战(一)两数之和

一.前言

  一直以来,算法学来学去,但是真正解题的时候,却运用不上来,在项目conding的时候,也不会想到。归根结底还是缺乏了必要的练习,现在开始刷leetcode,从头开始,坚持每天一题。

二.题目

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

     你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

  示例:给定 nums = [2, 7, 11, 15], target = 9,因为 nums[0] + nums[1] = 2 + 7 = 9,所以返回 [0, 1]

三.解题思路

  1.常见思路:这个题的最容易想到的就是暴力解法,两层循环,第一层中依次取出数组中的每个元素,第二层中依次取出第一层数组元素之后的元素,然后两个数相加与目标值target进行对比。代码如下:

 1 class Solution {
 2     public int[] twoSum(int[] nums, int target) {
 3         for(int i = 0; i < nums.length; i++){
 4             for(int j = i + 1; j < nums.length; j++){
 5                 if(nums[i] + nums[j] == target){
 6                     return new int[] {i, j};
 7                 }
 8             }
 9         }
10         throw new IllegalArgumentException("No two sum solution");
11     }
12 }

    该解法的空间复杂度是 O(1),时间复杂度是O(n^2);

  2.第二种解题思路是借助了哈希表,第一次迭代先将数组中所有元素,以及元素所对应的下标存进哈希表中,然后第二次迭代时,依次取出数组中的元素,计算出该元素与目标值target的差值,查看该差值是否在哈希表中,如果存在并且下标不是本次比较的元素(不能重复利用同一个元素),则返回该值和差值所对应的下标。代码如下:

 1 class Solution {
 2     public int[] twoSum(int[] nums, int target) {
 3         Map<Integer, Integer> hashMap = new HashMap();
 4         for(int i = 0; i < nums.length; i++){
 5             hashMap.put(nums[i], i);
 6         }
 7         for(int i = 0; i < nums.length; i++){
 8             int num = target - nums[i];
 9             if(hashMap.containsKey(num) && hashMap.get(num) != i){
10                 return new int[] {i, hashMap.get(num)};
11             }
12         }
13         throw new IllegalArgumentException("no two sum solution");
14     }
15 }

    该解法的空间复杂度为O(n),时间复杂度也为O(n);

  3.看到上面这种解法的时候,有的人可能就会想到了既然不能重复利用同一个元素,那么是不是能先进行比较,再把元素放进哈希表中呢?这就是我们的第三中解法,只使用一次迭代。和前面一样,先计算差值,然后去哈希表中查找,如果存在则返回结果,不存在则把该元素放入哈希表中。代码如下:

 1 class Solution {
 2     public int[] twoSum(int[] nums, int target) {
 3         Map<Integer, Integer> hashMap = new HashMap();
 4         for(int i = 0; i < nums.length; i++){
 5             int num = target - nums[i];
 6             if(hashMap.containsKey(num)){
 7                 return new int[] {i, hashMap.get(num)};
 8             }
 9             hashMap.put(nums[i], i);
10         }
11         throw new IllegalArgumentException("no two sum solution");
12     }
13 }

 

    

转载于:https://www.cnblogs.com/litterCoder/p/11372519.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值