1. Two Sum

Question

Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would have exactly one solution, and you may not use the same element twice.

Example:

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

1.两个和

问题

给定一个整数数组,返回两个数字的索引,使得它们加起来成为一个特定的目标。

您可以假设每个输入都有一个解决方案,您不能使用相同的元素两次。

例:

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

因为nums [0] + nums [1] = 2 + 7 = 9,
return [0,1]。

这是LeeCode的第一题,Easy难度,但凡是算法的题,不仅需要标准的输入输出,有的时候,我们更应该考虑的是解决方案的时间复杂度与空间复杂度。

(以下程序用的都是qt)

1.暴力解法,两个for循环遍历数组,将所有情况加一般,空间复杂度O(1),时间复杂度O(n2)。

QVector<int> twoSum(QVector<int> &numbers,int target)
{
    QVector<int> result;
    for(int i=0;i<numbers.count();i++)
    {
        for(int j=i;j<numbers.count();j++)
        {
            if(numbers[i]+numbers[j]==target)
            {
                result.append(i);
                result.append(j);
                return result;
            }
        }
    }
    return result;
}

 

2.先对数组进行排序,然后在进行查找,时间复杂度:O(nlogn)(取决于排序时间复杂度),空间复杂度:O(n)(取决于排序空间复杂度以及备份数组的空间复杂度)

QVector<int> twoSum(QVector<int> &numbers,int target)
{
    QVector<int> result;

    if (numbers.size() < 2)
        return result;
    //进行排序
    qSort(numbers.begin(), numbers.end());

    int i=0,j=numbers.count()-1;
    while(i<j)
    {
        if(numbers.at(i)+numbers.at(j)==target)
        {
            result.append(numbers.at(i));
            result.append(numbers.at(j));
            break;
        }
        else if(numbers.at(i)+numbers.at(j)>target)
        {
            j--;
        }
        else if(numbers.at(i)+numbers.at(j)<target)
        {
            i++;
        }
    }
    return result;
}

 

3.存入hash表,然后进行查找 时间复杂度为O(n),空间复杂度也是O(n),典型的时空权衡,通过付出一定的空间,大大的提高了运行的速度

QVector<int> twoSum(QVector<int> &numbers,int target)
{
    QVector<int> result;
    QMap<int, int> map;
    if (numbers.size() < 2)
        return result;
    //将number数组中的各项装入map中
    for (int i = 0; i < numbers.size(); i++)
        map[numbers[i]] = i;

    QMap<int, int>::iterator it;
    for (int i = 0; i < numbers.size(); i++)
    {
        if ((it = map.find(target - numbers[i])) != map.end())
        {
            if (i == it.value()) continue;
            result.push_back(i+1);
            result.push_back(it.value()+1);
            return result;
        }
    }
    return result;
}

 

posted on 2017-03-21 19:18  Perfunctory  阅读(190)  评论(0编辑  收藏  举报