每日算法之一:Two Sum

题目要求如下:

Given an array of integers, find two numbers such that they add up to a specific target number.

The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.

You may assume that each input would have exactly one solution.

Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2

给定一个整形数组和一个目标数字,要求:在数组中找到两个数字,使两数字之和为目标数字。同时输出两个数字在数组中的位置。

  对于这个问题,我们首先想到的就是遍历数组,找到第一个小于目标数字的位置不动,用第二个指针遍历,相加之后查看是否等于目标数字,相等则结束,不相等则让第一个指针后移,再次遍历。这样的复杂度是0(n2),显然还有更合适的算法。

题目给定的算法头部如下:

vector<int> twoSum(vector<int> &numbers, int target)

我们可以看出:1.返回的是整形向量。2.传递的是整形向量的引用。我们能够给出一种思路就是,如果向量是有序的,我们只要检查头尾之和是否是

目标数字,如果是可以返回输出(题目给出只有唯一解,当然,不返回全部遍历返回多解也是可以的),如果和数大于目标数字,那么为指针前移,如果小于目标数字,头指针后移,如此反复,直到头尾指针相遇。当然,如果排序之后,那么数组本身不能记住它本来所在的位置,因此需要增加辅助空间记录位置。具体的实现过程如下,从代码中我们可以很明显看懂作者的意图,复杂度为0(n).

struct Node
{
    int num, pos;
};
bool cmp(Node a, Node b)
{
    return a.num < b.num;
}

class Solution {
public:
    vector<int> twoSum(vector<int> &numbers, int target) {
        
       vector<int> result;
        vector<Node> array;
        for (int i = 0; i < numbers.size(); i++)
        {
            Node temp;
            temp.num = numbers[i];
            temp.pos = i;
            array.push_back(temp);
        }

        sort(array.begin(), array.end(), cmp);
        for (int i = 0, j = array.size() - 1; i != j;)
        {
            int sum = array[i].num + array[j].num;
            if (sum == target)
            {
                if (array[i].pos < array[j].pos)
                {
                    result.push_back(array[i].pos + 1);
                    result.push_back(array[j].pos + 1);
                } else
                {
                    result.push_back(array[j].pos + 1);
                    result.push_back(array[i].pos + 1);
                }
                break;
            } else if (sum < target)
            {
                i++;
            } else if (sum > target)
            {
                j--;
            }
        }
        return result;
        
    }
};

以上是求解过程,从代码中我们可以看到,向量中可以存储结构体,使用结构体存储内容和标识,在sort函数中通过自定义排序规则实现排序。

如果看见有什么错误或者有什么地方写的不对或者你有什么地方看不明白(可能是我表述有问题),请留言指出,我会尽快回复,谢谢!大笑


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值