美文网首页LeetCode
006-在数组里查找两个数的和等于指定值

006-在数组里查找两个数的和等于指定值

作者: Woodlouse | 来源:发表于2020-05-11 21:28 被阅读0次

描述

有一个整数数组,在数组里找两个数字,使得这两个数字的和为指定的值。

写一个函数,返回这两个数字的索引,返回的索引index1一定要小于index2,索引值不要基于零。

可以假设数组里只有一个答案。

分析

在一个数组里找两个数字的和等于指定值,最直观的方法是把数组中的每一个数字和这个数字之后的每一个数字相加,以此判断是否等于指定值,伪码如下:

for i=0 -> n-1:
    for j=i+1 -> n:
    if (A[i] + A[j] == target)
        find the target value

这种方法的时间复杂度为O(n^2),空间复杂度为O(1)。

有没有可能降低时间复杂度呢?可以借助辅助空间来降低时间复杂度的,使用一个哈希表,当遍历到一个数字时,计算出其和目标值得差值,然后在哈希表里查找是否有这个数字,有的话则查找成功,如果没有,则把当前数字放入到哈希表,继续遍历。

代码实现如下:

void findTwoSum01(int A[], int n, int target, int &index1, int &index2)
{
    index2 = index1 = -1;
    std::unordered_map<int, int> cache;
    for(int i=0; i<n; i++) {
        int reduce = target - A[i];
        auto iter = cache.find(reduce);
        if (iter != cache.end()) {
            index1 = (std::min(i, iter->second)) + 1;
            index2 = (std::max(i, iter->second)) + 1;
            break;
        }
        
        cache[A[i]] = i;
    }
}

这种方式的时间复杂度和空间复杂度都是O(n),典型的借助空间降低时间复杂度的做法。


代码在这儿

相关文章

  • 006-在数组里查找两个数的和等于指定值

    描述 有一个整数数组,在数组里找两个数字,使得这两个数字的和为指定的值。 写一个函数,返回这两个数字的索引,返回的...

  • JavaScript二分查找

    二分查找: 也称为折半查找,是指在有序的数组里找出指定的值,返回该值在数组中的索引。 查找步骤如下: 1.从有序数...

  • $.inArray()查找元素在数组中的索引值

    $.inArray()查找元素在数组中的索引值 $.inArray() : 在数组中查找指定值并返回它的索引(如果...

  • 寻找和为定值的两个数

    寻找和为定值的两个数 题目描述: 输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。如...

  • 和为S的两个数字

    输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数...

  • 21.和为S的两个数字

    输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数...

  • 和为S的两个数字

    输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数...

  • 42.和为S的两个数字

    输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数...

  • 剑指Offer-40 有序数组的两数和(首尾逼近法)

    输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数...

  • 和为s的两个数字

    输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数...

网友评论

    本文标题:006-在数组里查找两个数的和等于指定值

    本文链接:https://www.haomeiwen.com/subject/auqenhtx.html