leetcode第一天——两数之和(下)

学习内容:

 1.  分析题目 
 2.  使用Java用多种方法解答题目 
 3.  相关题目

1. 题目分析

在这里插入图片描述
意思就是这样:(见下图)
在这里插入图片描述
那么就有几个问题需要解决:

  • 实现元素相加
  • 相加后的值与target比较
  • 记录下标
  • 若比较值为相等则需返回下标值
  • 若不相等则需继续寻找

2. 多种解决方法(Java)

2.1 暴力解决【咔嚓咔嚓线性法】

Q: 实现元素相加
A: 固定一个元素,开始遍历其他的,并使之与固定元素相加
在这里插入图片描述
Q:相加后的值与target比较
A:用一个变量存下相加后的结果,与target比较。在这里插入图片描述
在这里插入图片描述
代码如下:

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

2.2 优化再优化(从leetcode大佬那学习得来!他讲的很好诶!)

为了不抄袭,我直接把大佬的粘贴过来!(后面附有链接!!和版权!)

// 时间复杂度:O(n)
// 空间复杂度:O(n)
// 空间换时间
public int[] twoSum(int[] nums, int target) {
    if (nums == null || nums.length == 0) return new int[0];

    // 数据预处理
    HashMap<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) { // O(n)
        map.put(nums[i], i);
    }

    for (int i = 0; i < nums.length; i++) { // O(n)
        int x = nums[i];
        // 哈希查找 - O(1)
        if (map.containsKey(target - x)) {
            int index = map.get(target - x);
            // i 和 index 不是同一个元素,同一个元素不能使用两次
            if (i != index) return new int[]{i, index};
        }
    }

    return new int[0];
}

作者:tangweiqun
链接:https://leetcode-cn.com/problems/two-sum/solution/zhu-jian-you-hua-yi-zhi-dao-zui-you-pei-sexli/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

我就来解释一下好了:

Q: 为什么使用HashMap而不是HashSet?

A:HashSet无法直接存储下标,或者说,在存储时还需要另一个数组。不然查找的时候依旧要遍历,并没有更加简便。而HashMap可以在存储数字时存下索引(下标)。这样查找时可直接对应,这样的查找时间复杂度是O(1)!!

关于HashMap的详细解说(来自别人)

由于👆上面这个方法有两个for循环,时间复杂度实际上O(2n)的,所以再进行了优化,去掉了一个for循环:(来自同一个大佬。有附有链接!)

// 时间复杂度:O(n)
// 空间复杂度:O(n)
// 空间换时间
public int[] twoSum(int[] nums, int target) {
    if (nums == null || nums.length == 0) return new int[0];
    int n = nums.length;

    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < n; i++) { // O(n)
        int x = nums[i];
        // 哈希查找
        if (map.containsKey(target - x)) {
            int index = map.get(target - x);
            return new int[]{i, index};
        }
        map.put(x, i);
    }
    return new int[0];
}

作者:tangweiqun
链接:https://leetcode-cn.com/problems/two-sum/solution/zhu-jian-you-hua-yi-zhi-dao-zui-you-pei-sexli/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

3 相关题目(来自大佬推荐!还不快看!)

这是一张图!需要自己去找!这都是相关练习!
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值