博客
关于我
2021-05-18 LeetCode “阿里巴巴企业题库” -------1. 两数之和、2、两数相加
阅读量:689 次
发布时间:2019-03-17

本文共 2581 字,大约阅读时间需要 8 分钟。

两数之和的双重循环方法

题目要求:给定两个数组中的一个含有两个数字的方法,可以得到他们相加的结果。首先,我想用双重循环的方法来解决这个问题。

解题思路

我们可以遍历第一个数组的每一个元素,然后在第二个数组中逐一匹配每一个元素,看是否存在满足条件的两个数字,其和等于目标值。如果发现匹配成功,则直接返回这两个数字的索引位置。这种方法的时间复杂度是O(n²),但对于短数组来说这是一个简单有效的方法。

代码实现

public int[] twoSum(int[] nums, int target) {    int[] index = new int[2];    for (int i = 0; i < nums.length; i++) {        for (int j = i + 1; j < nums.length; j++) {            if (nums[i] + nums[j] == target) {                index[0] = i;                index[1] = j;                return index;            }        }    }    index[0] = -1;    index[1] = -1;    return index;}

优化哈希表方法

为了优化这一步,我想到了一种更高效的方法——使用哈希表。哈希表能够将问题的复杂度从O(n²)降低到O(n),从空间复杂度下降到O(n)。

解题思路

  • 哈希表的定义:哈希表可以用来存储元素及其对应的值。当我们遍历数组时,我们可以每隔一个元素将当前元素的值作为键存储到哈希表中,其值则是其索引。然后,我们检查哈希表中是否存在一个值,使得当前元素加上目标值等于给定的目标。如果存在,则返回这两个索引。

  • 时间和空间复杂度:该方法的时间复杂度为O(n),因为我们只需要遍历一次数组。空间复杂度为O(n),因为我们需要存储哈希表。

  • 代码实现

    public int[] twoSum(int[] nums, int target) {    Map
    hashTable = new HashMap<>(); for (int i = 0; i < nums.length; i++) { int currentNum = nums[i]; if (hashTable.containsKey(currentNum)) { int j = hashTable.get(currentNum); int[] result = new int[2]; result[0] = j; result[1] = i; return result; } else { hashTable.put(currentNum, i); } } int[] result = new int[2]; result[0] = -1; result[1] = -1; return result;}

    逆序链表相加

    一个稍微难一点的题目是将两个没有排序的链表相加,并返回结果链表。需要注意的是,链表的顺序是从较低位到较高位排列,因此在相加时要适当处理进位。

    解题思路

  • 初始化变量:我们需要初始化一个新的链表来存储结果,并使用一个变量来跟踪进位。

  • 遍历链表:同时遍历两个链表,逐个节点进行相加运算。如果某个链表已经遍历完,则将当前元素视为0,继续处理下一个链表中的节点。

  • 处理进位:在每个节点中,计算当前值加上进位,然后更新当前节点的值和进位状态。

  • 构建结果链表:在每次处理完一个节点后,移动对应链表的指针,构建结果链表的相应节点。

  • 处理尾部进位:如果在遍历完所有节点后,仍有进位则需要在结果链表尾部添加对应的节点。

  • 代码实现

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {    ListNode result = new ListNode(0);   ListNode current = result;    int carry = 0;        while (l1 != null || l2 != null) {        int n1 = l1 != null ? l1.val : 0;        int n2 = l2 != null ? l2.val : 0;                int sum = n1 + n2 + carry;        carry = sum / 10;        int curVal = sum % 10;                if (current.next == null) {            current.next = new ListNode(curVal);        } else {            current = current.next;            current.val = curVal;        }                if (l1 != null) {            l1 = l1.next;        }        if (l2 != null) {            l2 = l2.next;        }    }        if (carry > 0) {        current.next = new ListNode(carry);    }        return result.next;}

    总结

    上述方法均是针对两数之和问题的不同解决思路,通过双重循环、哈希表以及链表结合进位技术实现了对问题的解决。每种方法都有其适用的场景和优劣势,选择哪种方法取决于具体问题的要求及性能需求。

    转载地址:http://didez.baihongyu.com/

    你可能感兴趣的文章
    SpringBoot使用RedisTemplate简单操作Redis的五种数据类型
    查看>>
    Thymeleaf sec:authorize 标签不生效
    查看>>
    微信JS-SDK DEMO页面和示例代码
    查看>>
    测试tensorflow是否安装成功 出现 SyntaxError: invalid syntax的错误
    查看>>
    Flask--简介
    查看>>
    Frame--Api框架
    查看>>
    Boostrap技能点整理之【网格系统】
    查看>>
    javaWeb服务详解(含源代码,测试通过,注释) ——Emp的Dao层
    查看>>
    Git简单理解与使用
    查看>>
    echarts 基本图表开发小结
    查看>>
    adb通过USB或wifi连接手机
    查看>>
    JDK9-15新特性
    查看>>
    TreeSet、TreeMap
    查看>>
    JVM内存模型
    查看>>
    可变长度参数
    查看>>
    3、条件查询
    查看>>
    cordova打包apk更改图标
    查看>>
    GitHub上传时,项目在已有文档时直接push出现错误解决方案
    查看>>
    文件系统的层次结构
    查看>>
    vue(渐进式前端框架)
    查看>>