博客
关于我
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/

    你可能感兴趣的文章
    android中button修改不了背景颜色
    查看>>
    uniapp自定义弹窗组件|仿微信android/ios弹窗效果
    查看>>
    Permission denied (publickey,gssapi-keyex,gssapi-with-mic)
    查看>>
    (网络安全)主动信息收集 操作系统识别
    查看>>
    Class和ClassLoader的getResource方法对比
    查看>>
    redis教程-redis环境搭建安装(qq:1197852132)
    查看>>
    github 入门
    查看>>
    cpp
    查看>>
    温故知新,.Net Core遇见Consul(HashiCorp),实践分布式服务注册与发现
    查看>>
    可编辑列表(json文件,可编辑,添加等)
    查看>>
    学生信息管理系统之增(五):添加用户信息流程
    查看>>
    社区医疗app-Ui设计
    查看>>
    Python图像处理之PIL
    查看>>
    HTML 表单验证
    查看>>
    mysql时间为0000-00-00 00:00:00时,程序读取错误
    查看>>
    ubuntu System program problem detected
    查看>>
    使用ivx图表组件的经验总结
    查看>>
    17场演讲,500+嘉宾 |「观远2020智能决策峰会暨产品发布会」看点先知道
    查看>>
    专访汇付数据副总裁姜靖宇:“纸上谈兵”时代终结,人工智能将变革第三方支付行业
    查看>>
    张小龙的“败走麦城”
    查看>>