数组类题目:两数之和

题目描述

给定一个数组arr,给定一个整数sum,寻找数组中是否存在两个数a1,a2,使得a1 + a2 == sum.

题目解析

以下是几种最容易想到的解决方式:

  1. 暴力求解
void  TwoSum(int *arr,int *result,int len,int sum)
{
    for(int i = 0;i<len;++i)
    {
        for(int j = i+1;j<len;++j)
        {
            if(arr[i]+arr[j] == sum)
            {
                result[0] = i;
                result[1] = j;
                return;
            }
        }
    }
}
  1. 排序 + 双指针: 前提是数组元素顺序允许改变

如果数组是无序的,先将数组进行排序,时间复杂度大约为0(NlogN),然后使用双指针,从两头开始遍历:
假设初始值i = 0,j = n - 1
如果arr[i] + arr[j] < sum,那么 i++
如果arr[i] + arr[j] > sum,那么 j–
如果arr[i] + arr[j] == sum,那么将下标i和j返回回去

void  TwoSum2(int *arr,int *result,int len,int sum)
{
    int i = 0;
    int j = len -1;
    while(i < j)
    {
        if(arr[i] + arr[j] > sum)
        {
            j--;
        }
        else if(arr[i] + arr[j] < sum)
        {
            i++;
        }
        else
        {
            result[0] = i;
            result[1] = j;
            return;
        }

    }
}
  1. 利用哈希表解决:

先将数组中的所有值散列到一个哈希表中,然后遍历数组,每次取一个值arr[i],找哈希表中是否存在一个值sum - arr[i],但是需要注意一点的是,假设数组arr = {1,2,2,7},sum = 4,那么我们找sum - arr[1]时,需要看哈希链表上有几个2,如果有2个2,那么就找到了,如果只有一个2,那么就是arr[1]本身,需要继续遍历的找。

在这里插入图片描述

void TwoSum(int *arr,int len,int target,int *result)
{
    //val : index
    std::unordered_map<int,int> count_;

    for(int i = 0; i < len;++i)
    {
        auto it = count_.find(target - arr[i]);
        if(it != count_.end())
        {
            result[0] = i;
            result[1] = it->second;
            return;
        }
        count_.insert({arr[i],i});
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一道程序设计题目,需要编写代码实现要。以下是一个可能的代码实现,供参考: ``` #include <iostream> #include <string> using namespace std; template<typename T> class MyArray { private: T* data; int size; public: MyArray(T* data, int size) { this->data = data; this->size = size; } T sum() { T result = 0; for (int i = 0; i < size; i++) { result += data[i]; } return result; } int search(T value) { for (int i = 0; i < size; i++) { if (data[i] == value) { return i; } } return -1; } }; int main() { int n1, n2, n3; cin >> n1; int* a = new int[n1]; for (int i = 0; i < n1; i++) { cin >> a[i]; } MyArray<int> array1(a, n1); int value1; cin >> value1; int pos1 = array1.search(value1); if (pos1 == -1) { cout << "未找到该元素" << endl; } else { cout << "是第" << pos1 + 1 << "个元素" << endl; } cout << "数组和为:" << array1.sum() << endl; cin >> n2; double* b = new double[n2]; for (int i = 0; i < n2; i++) { cin >> b[i]; } MyArray<double> array2(b, n2); double value2; cin >> value2; int pos2 = array2.search(value2); if (pos2 == -1) { cout << "未找到该元素" << endl; } else { cout << "是第" << pos2 + 1 << "个元素" << endl; } cout << "数组和为:" << array2.sum() << endl; cin >> n3; string* c = new string[n3]; for (int i = 0; i < n3; i++) { cin >> c[i]; } MyArray<string> array3(c, n3); string value3; cin >> value3; int pos3 = array3.search(value3); if (pos3 == -1) { cout << "未找到该元素" << endl; } else { cout << "是第" << pos3 + 1 << "个元素" << endl; } cout << "数组和为:" << array3.sum() << endl; delete[] a; delete[] b; delete[] c; return 0; } ``` 此代码中,我们首先定义了一个模板 `MyArray`,其中包含了查找和数组元素的功能。在主函数中,我们实例化了三个 `MyArray` 对象,分别对应一个 `int` 型的数组、一个 `double` 型的数组和一个 `string` 型的数组。我们先输入三个数组的长度和各自的元素值,然后对每个数组依次调用相应的成员函数完成题目,并输出结果。 需要注意的是,在实现 `MyArray` 的成员函数时,我们在和函数中使用了模板型参数 `T`,因此可以适用于任何型的数组。在搜索函数中,如果找到了目标元素,我们返回其索引;否则,返回 `-1` 表示未找到。在输出结果时,需要注意要输出“未找到该元素”和“是第X个元素”种情况的不同输出格式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值