LeetCode第二题 “两数相加” 比官方更优质

简介: LeetCode第二题 “两数相加” 比官方更优质

1. 两数之和

题目来源:力扣(LeetCode)
给定一个整数数组 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) {

    }
}

不论是学习,刷题,考试,面试。其实都有一个定律,无答案 < 复杂答案 < 简单正确答案。

我们刷LeetCode时也可以根据这个套路走。没有一口吃成胖子的人,所有的东西都是一步步进化而来。

简单思路

看到题目,我们脑子里大概有了些思路,看到结果我们知道一定要返回一个新数组,那。。。

int[] newNums= new int[2];
//TODO
return newNums;

这个两行代码坑定是有的。也就是最后得到的两个值要放到这个新的newNums数组中。现在要做的是求这个两个数。

我们就按我们自己的思路来,我拿nums第一个数和剩余的所有数各自相加如果等于target,那不就找到了吗?如果没有,那就走第二步,拿第二个数和剩余的数各自相加。。。直到找到,或者走完所有的数。

代码实现:

public int[] twoSum(int[] nums, int target) {
    int[] newNums= new int[2];
    //第一次拿的数
    for (int i = 0; i < nums.length; i++) {
        //第二次拿的数
        for (int j = i + 1; j < nums.length; j++) {
            //如果两个相等则向newNums赋值退出
            if (nums[i] + nums[j] == target){
                newNums[0] = i;
                newNums[1] = j;
                break;
            }
        }
    }
    return newNums;
}


这就是现实了,那开始改进吧!

进阶

我们可不可以用java里现成的工具类呢?list里面好像有个contains()方法可以帮我们找元素,我们那就不用遍历了好像。
思路:我们用target减去第一个元素得到一个结果,然后在剩余的list里面查找是否包含这个结果那不就对了吗?不包含就往下走。额。。。好像需要创建好多list,有什么好办法吗?

有了!

我把的到的结果放到list里面只要在循环开始的时候判断元素是不是在结果里面,在的话不就找到了吗?结果所在的位置就是开始的元素。

代码实现:

public int[] twoSum1(int[] nums, int target) {
    int[] newNums= new int[2];
    List<Integer> list = new ArrayList<>();
    //第一次拿的数
    for (int i = 0; i < nums.length; i++) {
        //看看是否包含
        if (list.contains(nums[i])) {
            newNums[0] = list.indexOf(nums[i]);
            newNums[1] = i;
            break;
        }
        //不包含把结果放到list里面
        list.add(target - nums[i]);
    }
    return newNums;
}


实现是实现了,但是这效率。。。进阶失败。为什么呢?
分析原因:
这地方好像是用来listcontainsindexOf方法了,我们看下源码怎么实现的。

源码
contains

public boolean contains(Object o) {
        return indexOf(o) >= 0;
    }

indexOf

public int indexOf(Object o) {
    if (o == null) {
        for (int i = 0; i < size; i++)
            if (elementData[i]==null)
                return i;
    } else {
        for (int i = 0; i < size; i++)
            if (o.equals(elementData[i]))
                return i;
    }
    return -1;
}

。。。 找到原因了,我里外里循环了三次,肯定比第一次慢多了。那没有好的办法了吗?

再次进阶

listcontains不行,那hashMapcontains,这个方法的时间复杂度应该是O(1),试试吧。思路和list思路相同,只是把key的的位置放结果,value的位置放元素的位置。

代码实现:

public static int[] twoSum2(int[] nums, int target) {
    int[] newNums= new int[2];
    HashMap<Integer, Integer> hashMap = new HashMap<>();
    //第一次拿的数
    for (int i = 0; i < nums.length; i++) {
        //看看是否包含
        if (hashMap.containsKey(nums[i])) {
            newNums[0] = hashMap.get(nums[i]);
            newNums[1] = i;
            break;
        }
        //不包含把结果放到list里面
        hashMap.put(target - nums[i], i);
    }
    return newNums;
}

哇,这个速度,应该应该可以完结撒花了吧,🎉🎉🎉。

相关文章
炸了!力扣官方首发了这套1568页LeetCode算法刷题笔记(彩页版)
你知道现在LeetCode算法在大厂中的重要性吗? 前几天小编看了一个国内算法大神的短视频,他就在视频中指出了算法对当下无论是生活还是找工作中都是非常重要的! 没错这个人就是江湖人称“左神”的左程云老师 小编也简单看了一下一些比较知名互联网大厂的招聘,像阿里,字节,美团,京东,百度等都在简介明确写上了要求“算法精通”! 那么如何达到“算法精通”今天小编特意给大家分享出一套1568页的LeetCode算法刷题(彩页版)笔记,助力你早日在简历写上“算法精通”
炸了!力扣官方首发了这套1568页LeetCode算法刷题笔记(彩页版)
秀到起飞!LeetCode官方推出算法面试指导手册(代码版)限时开源
leetcode是个题库,里面有很多编程多面试的题目,可以在线编译运行。难度比较高。如果自己能做出来,对面大公司很有帮助。 建议一次只针对一种题型进行训练,如数组、链表、二叉树、回溯、动态规划,这样效果会更好。
(C语言版)力扣(LeetCode)189. 轮转数组官方3种解法分析
尽可能想出更多的解决方案,至少有 三种 不同的方法可以解决这个问题。
|
算法 C++
LeetCode两数之和-初学C++ 官方哈希解法代码注释-C++代码
LeetCode两数之和-初学C++ 官方哈希解法代码注释-C++代码
|
4月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
64 6
|
5月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
130 2
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
54 1
|
4月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
5月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
77 7