欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

leetcode 1.Two Sum 两数之和

程序员文章站 2024-03-09 11:51:53
...

题目(英文版)

[LeetCode] 1. Two Sum 两数之和

 

Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would have exactly one solution, and you may not use the same element twice.

Example:

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

题目的中文意思:

给定一个整数数组,然后在给定一个数,要求数组的两个数加起来要等于给定的数,然后返回数组相加两个数字的索引。


您可以假设每个输入都只有一个解决方案,并且不能两次使用相同的元素。

例子:

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,

return [0, 1].


解答:

解法一(用暴力**的方式):

暴力**思路:

leetcode 1.Two Sum 两数之和

 暴力**的代码:

public class Main {
    //定义一个找下标方法twoSum
    public static void twoSum(int[] num,int sum){
        //定义一个中间变量temp,用来存储两个相加要找的第二个数
        //比如2是数组的第一个数,9-2=7
        //我们知道我们要存的第二个数为7
        int temp;
        //开始循环,首先第一次循环找出两数相加的第一个数
        //比如我们这里的2
        for(int i = 0;i<num.length;i++){
            //确定要找的第二个数,比如我们这里的7
            temp = sum - num[i];
            //第二层循环,注意是要从i开始后面的数中找。在数组中找到7
            for(int j = i+1;j<num.length;j++){
                //找到了
                if(num[j]==temp){
                    //打印出下标
                    System.out.println(i+"-"+j);
                    //退出方法
                    return;
                }
            }
        }
    }

    public static void main(String[] args) {
        //测试数据
        int[] a = new int[]{2,3,1,4,2,7};
        //测试数据
        int sum = 9;
        twoSum(a,9);
    }
}

但用暴力**方法的时间复杂度为O(n^2),空间复杂度为O(1).

下面我们介绍另一种解法:

借助Map的方式:

leetcode 1.Two Sum 两数之和

 代码:

import java.util.HashMap;
import java.util.Map;

public class Main {
    //定义一个找下标方法twoSum
    public static int[] twoSum(int[] num,int sum){
        //定义有两个值的result数组,用来存储两个相加数的下标
        int[] result = new int[2];
        //判断,如果数组没有数或只有一个数,那不存在这样的下标
        if((num == null) || num.length<1) return result;
        //定义存储数组数和下标的Map
        Map<Integer,Integer> map = new HashMap<Integer, Integer>();
        //循环
        for(int i=0;i<num.length;i++){
            //一次判断数组的数,比如这里假设是第一个数2
            int n = num[i];
            //求出要的第二个数
            int temp = sum - n;
            //判断Map中是否存在这样的数
            if(map.containsKey(temp)){
                //存在返回结果
                result[0] = i;
                result[1] = map.get(temp);
                return result;
            }else{
                //不存在则将该数存到Map,以便下次循换判断
                map.put(n,i);
            }
        }
        return result;
    }

    public static void main(String[] args) {
        //测试数据
        int[] a = new int[]{3,1,4,2,7};
        //测试数据
        int sum = 9;
         int[] res = new int[2];
         res = twoSum(a,sum);
        System.out.println(res[0]+"-"+res[1]);
    }
}

这是使用了一个Map,用空间换取时间,因为循环只遍历一次

所以时间复杂度为O(n),空间复杂度为O(n)

上面的暴力**时间复杂度为O(n^2),空间复杂度为O(1)

在现在对时间效率要求高的话,第二种解法可能会好一点。


好了,本次的分享到此结束,有错误的地方欢迎大家下方留言。

如果觉得本分享对您有帮助的话,希望你能给我点个关注或喜欢QWQ,作为我创作的动力。

如果有不理解的在下方留言,我会及时回复的。