力扣刷题 | 两数之和

目前主要分为三个专栏,后续还会添加:

专栏如下: C语言刷题解析 C语言系列文章 我的成长经历

感谢阅读!

初来乍到,如有错误请指出,感谢!


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

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

你可以按任意顺序返回答案。

示例 1:

复制代码
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

复制代码
输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3:

复制代码
输入:nums = [3,3], target = 6
输出:[0,1]

给定一个整数数组 `nums` 和一个目标值 `target`,返回数组中两个数的索引,使得这两个数相加等于目标值 `target`。

这个函数使用了嵌套循环来遍历数组中的每一对数字,直到找到满足条件的两个数。

cpp 复制代码
int* twoSum(int* nums, int numsSize, int target, int* returnSize)
{
    // 外层循环,遍历数组中的每个元素
    for (int i = 0; i < numsSize; ++i)
    {
        // 内层循环,遍历外层循环当前元素之后的所有元素
        for (int j = i + 1; j < numsSize; ++j)
        {
            // 检查两个元素的和中是否等于目标值
            if (nums[i] + nums[j] == target)
            {
                // 如果找到满足条件的两个数,则分配一个大小为2的整数数组
                int* ret = malloc(sizeof(int) * 2);
                // 将两个数的索引存入数组
                ret[0] = i, ret[1] = j;
                // 设置返回数组的大小为2
                *returnSize = 2;
                // 返回结果数组
                return ret;
            }
        }
    }
    // 如果没有找到满足条件的两个数,则返回数组大小为0
    *returnSize = 0;
    // 返回NULL
    return NULL;
}

代码解释:

  1. 函数定义:`int* twoSum(int* nums, int numsSize, int target, int* returnSize)` 是一个返回整数指针的函数。它接受四个参数:一个整数数组 `nums`,数组的大小 `numsSize`,目标值 `target`,以及一个指向整数 `returnSize` 的指针,用于返回结果数组的大小。

  2. 双重循环:使用两个嵌套的 `for` 循环遍历数组 `nums`。外层循环变量 `i` 从 0 到 `numsSize - 1`,内层循环变量 `j` 从 `i + 1` 到 `numsSize - 1`。这样做是为了确保每个元素只被访问一次,并且不会重复计算相同的元素对。

  3. 检查和:在内层循环中,检查 `nums[i] + nums[j]` 是否等于 `target`。如果找到满足条件的两个数,则进入下一步。

  4. 分配内存和返回结果:如果找到满足条件的两个数,使用 `malloc` 分配一个大小为 2 的整数数组 `ret`。将两个数的索引 `i` 和 `j` 分别存入 `ret` 的第一个和第二个位置。然后,将 `returnSize` 设置为 2,表示结果数组的大小为 2。最后,返回结果数组 `ret`。

  5. 没有找到结果:如果双重循环结束后没有找到满足条件的两个数,则将 `returnSize` 设置为 0,并返回 `NULL`。

性能分析:

这个算法的时间复杂度是 O(n^2),其中 n 是数组 `nums` 的大小。这是因为对于数组中的每个元素,都需要遍历它之后的所有元素来检查是否存在一对和为 `target` 的数。对于较大的数组,这个算法可能会比较慢。

优化建议:

一种更高效的方法是使用哈希表来降低时间复杂度。具体做法是遍历数组,对于每个元素,计算 `target` 与该元素的差值,然后检查这个差值是否已经在哈希表中。如果存在,则找到了一对和为 `target` 的数;如果不存在,则将当前元素及其索引添加到哈希表中。这种方法的时间复杂度是 O(n)。

相关推荐
阿珊和她的猫3 小时前
v-scale-scree: 根据屏幕尺寸缩放内容
开发语言·前端·javascript
fouryears_234176 小时前
Flutter InheritedWidget 详解:从生命周期到数据流动的完整解析
开发语言·flutter·客户端·dart
我好喜欢你~6 小时前
C#---StopWatch类
开发语言·c#
lifallen7 小时前
Java Stream sort算子实现:SortedOps
java·开发语言
IT毕设实战小研7 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
cui__OaO9 小时前
Linux软件编程--线程
linux·开发语言·线程·互斥锁·死锁·信号量·嵌入式学习
鱼鱼说测试9 小时前
Jenkins+Python自动化持续集成详细教程
开发语言·servlet·php
艾莉丝努力练剑10 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
CHEN5_0210 小时前
【Java基础面试题】Java基础概念
java·开发语言
Cx330❀11 小时前
【数据结构初阶】--排序(五):计数排序,排序算法复杂度对比和稳定性分析
c语言·数据结构·经验分享·笔记·算法·排序算法