1.两数之和

简介: 1.两数之和

题目:

在这里插入图片描述

分析:

题目中已经提示了每种输入只会对应一个答案,也就是说这个数组是一个比较特殊的数组,数组中两个数相加得到的目标值target是唯一的,不可能存在多对两个数相加得到同一个目标值target,也就是说我们得到了两个数相加的值等于target了,这个时候我们可以直接返回,因为每种输入只会对应一个答案,后面不会存在其他两个数相加等于目标值target的情况。

蛮力解法:

public class TwoSum {
    
    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};
                }
            }
        }
        return null;
    }

    public static void main(String[] args) {
    
        System.out.println(Arrays.toString((new TwoSum().twoSum(new int[]{
    3,2,4},6))));
    }
}

优化分析:

可以看到题目要求我们返回的两个数是有关联的,我们把这两个数定义为numA和munB,他们的关系为:numA+numB=target
numB=target - numA
也就是说如果其中一个数是numA,那么其中另外一个数一定是target - numA
此时我们可能会产生这样的想法,既然两个数都和numA有关联,target是一个已经确定的值,我们在第一层遍历的时候能否记录一下相关的数值,来减少循环次数呢?
也就是说我们能否在外层遍历的时候,记录一些相关信息,以省去内层的一层循环。
下面这种方法用到的查找表法来记录相关信息,记录的相关信息为:外层遍历过的数值,以及它所对应的下标
查找表法一般来说有两种实现方式:哈希表和平衡二叉搜索树,这里我们不需要维护查找表中元素的顺序,所以我们选择用哈希表来做。

优化代码:

public class TwoSumNew {
     
    public int[] twoSum(int[] nums, int target) {
     
        int[] res = new int[2];
        if(nums == null || nums.length == 0){
     
            return res;
        }
        int length = nums.length;
        //初始化时指定长度,避免后续扩容影响性能
        Map<Integer, Integer> map = new HashMap<>(length-1);
        for(int i = 0; i < length; i++){
     
            int temp = target - nums[i];
            if(map.containsKey(temp)){
     
                res[1] = i;
                res[0] = map.get(temp);
            }
            map.put(nums[i], i);
        }
        return res;
    }

    public static void main(String[] args) {
     
        System.out.println(Arrays.toString((new TwoSumNew().twoSum(new int[]{
     3,2,4},6))));
    }
}
                
目录
相关文章
|
29天前
|
存储 算法 C++
LeetCode第二题(两数相加)
这篇文章是关于LeetCode上第二题“两数相加”的题解,其中详细描述了如何使用C++语言来实现将两个逆序存储的非负整数链表相加,并返回结果链表的算法。
26 0
LeetCode第二题(两数相加)
|
26天前
|
Python
01、两数之和——2021-04-12
01、两数之和——2021-04-12
9 0
|
29天前
|
存储
Leetcode第29题(两数相除)
LeetCode第29题要求使用不包含乘法、除法和mod运算符的方法计算两个整数的商,通过记录结果的正负,将问题转化为负数处理,并利用二进制幂次方的累加来逼近除数,最后根据结果的正负返回相应的商。
14 0
|
1月前
|
Go Python
01.两数之和
01.两数之和
13 0
|
3月前
|
算法
LeetCode第29题两数相除
这篇文章介绍了LeetCode第29题"两数相除"的解题方法,通过使用加法、减法和二进制位移法代替常规的乘除操作,并考虑了整数溢出问题,提供了一种高效的算法解决方案。
LeetCode第29题两数相除
|
3月前
|
JavaScript 前端开发 PHP
leetcode——两数相加【二】
leetcode——两数相加【二】
32 0
|
5月前
1.两数之和
1.两数之和
|
6月前
|
存储 算法 Go
LeetCode第二题: 两数相加
 给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
LeetCode第二题: 两数相加