leetcode题解

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

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

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

前提条件
1.只有一种结果
2.数据不可复用

题解方案
1.暴力枚举
for循环 寻找当前数据的互补目标元素
复杂度 n2 空间复杂度o(1)
2.两边hash表
原理:我们需要一种更有效的方法来检查数组中是否存在目标元素。如果存在,我们需要找出它的索引。保持数组中的每个元素与其索引相互对应的最好方法是什么?哈希表
第一遍构建 hashMap
第二遍 寻找互补数 注意 判断元素不是自己
空间换时间
3.一遍hash表

题解

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            int complement = target - nums[i];
            if (map.containsKey(complement)) {
                return new int[] { map.get(complement), i };
            }
            map.put(nums[i], i);
        }
        throw new IllegalArgumentException("No two sum solution");
    }
}

2.两数相加
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:
我们使用变量来跟踪进位,并从包含最低有效位的表头开始模拟逐位相加的过程。

注意点:
考虑进位

carray位 必是 0或者1

到达末尾,设置进位为0

设置sum=x+y+carray 更新节点,在最高进位为0 单独设立一个节点。

将当前节点 设置为返回初始化列表的亚节点 返回亚加点的下一个

时间复杂度 O(m+n) 空间复杂度 最大m+n+1

扩展解法: 递归或者 栈 或者倒序

哑节点 dumpyHead=new ListNode(0) return dumpyNode.next()

字符串相乘
3给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

示例 1:

输入: num1 = “2”, num2 = “3”
输出: “6”
示例 2:

输入: num1 = “123”, num2 = “456”
输出: “56088”
说明:

num1 和 num2 的长度小于110。
num1 和 num2 只包含数字 0-9。
num1 和 num2 均不以零开头,除非是数字 0 本身。
不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/multiply-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

https://blog.csdn.net/afei__/article/details/83891547

拆分为两步 一步 求当前位 一步处理进位

你可能感兴趣的:(算法题)