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

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

作leetcode题目的时候,常常百度答案,但感受大多不是我想要的,不少我不能理解。如今也作了一些算法题,哪些并非很深奥,但须要一些技巧,简单的算法题更多的是经验值。这里,开启算法题篇章。给本身记忆,但愿不要误人子弟。数组

题目

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

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

示例:spa

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

由于 nums[0] + nums[1] = 2 + 7 = 9
因此返回 [0, 1]复制代码

解题

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

理解:

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

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

为何暴力破解不佳:

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

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
复制代码
相关文章
相关标签/搜索