利用双重循环解决两数之和问题

题目要求在一个整数数组 nums 中,找到两数之和等于目标值 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]
    • 解释:因为 nums[1] + nums[2] == 6,返回 [1, 2]
  • 示例 3:

    • 输入:nums = [3, 3]target = 6
    • 输出:[0, 1]
    • 解释:因为 nums[0] + nums[1] == 6,返回 [0, 1]

提示

  • 数组的长度 nums.length 在 2 到 10,000 之间。
  • 每个元素 nums[i] 的范围在 -10^9 到 10^9 之间。
  • target 的范围也是在 -10^9 到 10^9 之间。
  • 只会存在一个有效答案。

代码讲解

我们使用的是一个非常直观的方法,即双重循环遍历数组的每个可能的元素对来检查它们的和是否等于目标值 target

#include <vector>
using namespace std;

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
       vector<int> result;
       int n = nums.size();
       for (int i = 0; i < n - 1; i++) {
           for (int j = i + 1; j < n; j++) {
               if ((nums[i] + nums[j]) == target) {
                   return vector<int>{i, j};
               }
           }
       }
       // 如果没有找到符合条件的元素对,虽然题目说一定存在,但这里返回一个空 vector 以防万一
       return result;
    }
};

代码详细解析

  1. 定义返回值和获取数组长度

    vector<int> result;
    int n = nums.size();
    
    • result:用来存储结果的索引对。
    • n:数组 nums 的长度。
  2. 双重循环遍历数组

    for (int i = 0; i < n - 1; i++) {
        for (int j = i + 1; j < n; j++) {
    
    • 外层循环 i 从 0 到 n-2:表示遍历每个主元素。
    • 内层循环 j 从 i + 1 到 n-1:表示从 i 的下一个元素开始向后遍历,用来查找使和为目标值 target 的另一个元素。
  3. 检查元素和是否等于目标值

    if ((nums[i] + nums[j]) == target) {
        return vector<int>{i, j};
    }
    
    • 对每一对 nums[i] 和 nums[j],检查它们的和是否等于 target
    • 如果条件成立,立即返回包含这两个索引的向量 vector<int>{i, j}
  4. 返回空结果

    return result;
    
    • 如果没有找到符合条件的元素对,返回一个空的结果向量。
    • 由于题目假设一定存在一个答案,这一步通常不会被执行,但为了保险起见保持代码的完整性。

时间复杂度分析

  • 外层循环执行 n-1 次。
  • 内层循环的执行次数依赖于 i 的值,总体的执行次数大约为 n * (n-1) / 2 次。
  • 因此,总时间复杂度为 O(n2)。
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值