简单算法题:leetcode-1 两数之和

298 阅读2分钟

算法撸一遍,从简单的开始。

做leetcode题目的时候,经常百度答案,但感觉大多不是我想要的,很多我不能理解。现在也做了一些算法题,哪些并不是很深奥,但需要一些技巧,简单的算法题更多的是经验值。这里,开启算法题篇章。给自己记忆,希望不要误人子弟。

题目

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

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

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

解题

这是LeetCode算法题库的第一个算法题,比较简单。题目读一遍,然后整理一下题目的意思。

理解:

1:在一个整数数组中,必定有两个数相加等于target。

2:需要记录这两个数的下标,合成数组返回

为什么暴力破解不佳:

在大多数没有做过算法题的思维下,第一选择方案是暴力破解,但这个时间复杂度是成指数增长的。如果这个数组是一千个,两个for循环进行计算,也就是要计算一千的平方。这样太消耗时间和内存。

HashMap解题:

再来看一下理解1,在这个数组中必定有两个数相加是等于target。

整理一下思路

1:数组中有numberA + numberB = target

2:target - numberA = numberB

3:数组的会有一个数被 target减去之后得到的数,必定存在这个数组中

需要做的:

1:记录下被target减去得到的数,和当前计算数在数组中的下标


这里选择记录用HashMap,这里就没有个大家讲解HashMap了。知道它的Api使用就可以了。

Map map = new HashMap();
map.put(key,var);//存
var = map.get(Key)

代码:

public static int[] twoSum(int[] nums,int target){
    int var ;
    Map<Integer,Integer> map = new HashMap<Integer, Integer>();
    for (int i = 0; i < nums.length; i++) {
        Integer integer = map.get(nums[i]); //查看是否循环到了减去之后得到的值
        if (integer != null){ //如果不为null,说明找的值找到了
            return new int[]{integer,i};
        }
        var = target - nums[i]; //得到当前减去之后得到的数
        map.put(var,i);//记录每一个被减之后得到的值,和当前下标
    }
    return null;
}

main方法

public static void main(String[] age){
    int[] a = {2, 7, 11, 15};
    int[] ints = twoSum(a, 9);
    if (ints == null){
        System.out.println("没有找到");
    }
    for (int anInt : ints) {
        System.out.println(anInt);
    }
}

打印结果

0
1