Leetcode之1-两数之和I(Two Sum)

前言

个人网站

公众号: 北京程序猿, 网站 : https://yaml.vip

算法真的重要么

有很多开发者可能有个疑问,平时写代码几乎用不到算法,为何出去面试时几乎所有公司都会面试算法题。

我相信有这个疑问的程序员不在少数。

最近逛知乎时看到一则关于面试算法是否有必要的帖子,大家也许在这可以找到答案

作为一名做 Web 开发的 Java 工程师,算法在工作中基本不怎么用到,但为什么面试总会问算法的问题?

在工作中笔者也参与了不少面试,如何通过短短一个小时的面试去衡量面试者代码水平,答案只有一个:算法。

大家可以想想,数据量上亿的场景下O(N)和O(N^2)时间复杂度的解法时间耗时是否处于一个Level,当自己的leader review代码时内心会怎么想。相信此时各位内心已经有了答案。

面试算法题可以考察的点:

  1. 考虑问题的全面性
  2. 想法转换为代码的能力
  3. 面试者是否聪明(是否可以通过面试官的提示写出代码)
  4. 沟通能力

刷算法题平台

  1. Leetcode
  2. 力扣(Leetcode国内版)
  3. 领扣
  4. 牛客网

算法题

题干

给定一个整数数组num和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例

给定 num = [2, 7, 11, 15], target = 9。
因为 num[0] + num[1] = 2 + 7 = 9,所以返回 [0, 1]

解法

  1. 暴力破解
  2. 排序+前后两个指针
  3. 单指针+HashMap

复杂度

  1. 时间复杂度O(N^2)
  2. 时间复杂度O(NlogN)(通用排序算法时间复杂度)
  3. 时间复杂度O(N),空间复杂度O(N)

Java代码

public static int[] twoSum(int[] array, int target) {
    int[] result = new int[2];
    if (array == null || array.length <= 1) {
        return result;
    }
    Map<Integer, Integer> map = new HashMap<>(64);
    final int length = array.length;
    for (int i = 0; i < length; i++) {
        int element = target - array[i];
        if (map.containsKey(element)) {
            return new int[]{map.get(element), i};
        }
        map.put(array[i], i);
    }
    return result;
}

思考题

  1. 第九行代码为何用减法,而不用加法? 用加法会有问题么?
  2. 题目中有几个限定条件,如果限定条件去掉,代码该如何写?
    • 把所有答案都找出来?
    • 数字可以重复利用?
  3. 如果给定的数组是有序的?

本文著作权归作者所有。

商业转载请联系作者获得授权,非商业转载请于文首标明作者姓名,保持文章完整性,并附上出处和文章链接!未按规范转载者,作者保留追究相应责任的权利!

作者:北京程序猿

链接: https://yaml.vip/2019/03/04/Leetcode%E4%B9%8B1-%E4%B8%A4%E6%95%B0%E4%B9%8B%E5%92%8CI/

    原文作者:北京程序猿
    原文地址: https://www.jianshu.com/p/38f5a3aeb862
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞