力扣 - 1、俩数之和

2023-11-14

题目

给定一个整数数组 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]

示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]

提示:
2 <= nums.length <= 103
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum

分析

方法一 暴力求解
双层循环,成立条件i != j && nums[i] + nums[j] == target 创建一个用于存储记录下标的数组。

C:

int* twoSum(int* nums, int numsSize, int target, int* returnSize){
    int *tmp = (int*)malloc(2 * sizeof(int));//创建存放返回值的空间
    for(int i = 0; i < numsSize; i++)
    {
        for(int j = i + 1; j < numsSize; j++)
        {
            if(nums[i] + nums[j] == target)
            {
                tmp[0] = i;
                tmp[1] = j;
                *returnSize = 2;//返回2个
                return tmp;
            }
        }
    }
    *returnSize = 0;//返回0个
    return tmp;
}

C++:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> tmp;
        for(int i = 0; i < nums.size(); i++)
        {
            for(int j = i + 1; j < nums.size(); j++)
            {
                if(nums[i] + nums[j] == target)
                {
                    tmp.push_back(i);
                    tmp.push_back(j);
                    return tmp;
                }
            }
        }
        return tmp;
    }
};

JAVA:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int len = nums.length;
        for(int i = 0; i < len; i++)
        {
            for(int j = i + 1; j < len; j++)
            {
                 if(nums[i] + nums[j] == target)
                {
                   return new int[]{i, j};//创建匿名数组
                }
            }
        }
        return new int[0];//返回空数组
    }
}

复杂度分析
时间复杂度:O(N^2),其中 N 是数组中的元素数量。最坏情况下数组中任意两个数都要被匹配一次。
空间复杂度:O(1)。

方法二 哈希表查找

用哈希表<值,下标>来倒着存放。
如果不考虑有俩相同的元素,我们可以用map或者unordered_map这种不重复的map容器。
先构造哈希表,然后一次遍历查找就可以了。如下:
C++:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        map<int,int> hashmap;//提供一对一的hash
        vector<int> tmp;//存放返回值

        for(int i = 0; i < nums.size(); i++)//构造哈希表
        {
            hashmap.push_back(pair<int, int>(nums[i], i));
            //反过来放入map中,用来获取结果下标
        }
    
        for(int i = 0; i < nums.size(); i++)//查找
        {
            if(a.count(target-nums[i]) > 0)
            {//nums[i]还未存入哈希表中,如果表中有另一半直接跳出
                b.push_back(a[target - nums[i]]);
                b.push_back(i);
                break;
            }
        }
        return b;
    };
};

但是碰到用例输入:nums = [3,3], target = 6 输出:[0,1] 就会出现问题,因为map不允许有重复的key值元素,所以我们可以先判断然后根据结果来确定是返回,还是存放入哈希表中。
C++:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        map<int,int> hashmap;//提供一对一的hash
        vector<int> tmp;//存放返回值
    
        for(int i = 0; i < nums.size(); i++)//查找
        {
            if(hashmap.count(target-nums[i]) > 0)
            {//nums[i]还未存入哈希表中,如果表中有另一半直接跳出
                tmp.push_back(hashmap[target - nums[i]]);
                tmp.push_back(i);
                break;
            }
            hashmap.insert(pair<int, int>(nums[i], i));
            //反过来放入map中,用来获取结果下标
        }
        return tmp;
    };
};

JAVA:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int len = nums.length;
        HashMap<Integer,Integer> hashmap = new HashMap<>();

        for(int i = 0; i < len; i++)//查找
        {
            if(hashmap.containsKey(target-nums[i]))
            {//nums[i]还未存入哈希表中,如果表中有另一半直接跳出
                return new int[]{i,hashmap.get(target-nums[i])};
            }
            hashmap.put(nums[i], i);
            //反过来放入map中,用来获取结果下标
        }
        return new int[0];
    }
}

本章完

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

力扣 - 1、俩数之和 的相关文章

随机推荐

  • ctfhub技能树部分wp(潦草笔记)

    备份文件下载 vim缓存 在使用vim时会创建临时缓存文件 关闭vim时缓存文件则会被删除 当vim异常退出后 因为未处理缓存文件 导致可以通过缓存文件恢复原始文件内容 隐藏文件index php swp前加 以 index php 为例
  • 仿牛客网项目第三章:开发社区核心功能(详细步骤和思路)

    目录 1 过滤敏感词 1 1 目的 1 2 实现方法 1 3 前缀树 1 4 敏感词过滤步骤 为发帖子做准备 2 发布帖子 2 1 AJAX介绍 2 2 AJAX使用实例 3 帖子详情 3 1 实现功能 3 2 实现过程 4 事务管理 4
  • little endian && big-endian

    java 的ClassFile采用big endian存储数据 Intel x86 采用little endian Motorola采用big endian 0x1234 Intel 地址 0x4000 0000 0x34 0x4000 0
  • vue-使用sass定义全局样式及变量

    vue cli2使用sass定义全局样式及变量 vue cli2创建的vue项目使用sass预处理器需按顺序安装以下插件 其中sass loader版本和node sass需要安装固定版本 其他的依赖不要求版本 亲测有效 如果不不固定sas
  • unity Domain Reload & scene Reload 静态变量重置

    关闭 Domain Reload 选项后 c 的静态变量在下次运行时不会怎么重置 需要手动添加重置代码 使用下面的属性设置重置变量函数 using UnityEngine public class StaticCounterExampleF
  • ns.ajax,UIWebView使用NSURLProtocol(拦截),ajax加载失败的问题

    问题 ajax跨域访问是一个老问题了 解决方法很多 比较常用的是JSONP方法 JSONP方法是一种非官方方法 而且这种方法只支持GET方式 不如POST方式安全 即使使用jquery的jsonp方法 type设为POST 也会自动变为GE
  • 解决eclipse新建dynamic web project没有apache的Runtime environment问题

    在新建eclipse web项目时候 想选择Tomact服务器 不过运行时环境选择中没有 没有出现下图的Apache目录吗 网络上好像没有找到教程 其实很简单 只是没有装上相应的插件 解决步骤如下 1 打开Help gt Install N
  • ThinkPad BIOS 设置详解

    ThinkPad BIOS 设置详解 ThinkPad BIOS 设置详解 主流 新机型 在网上查看了相关资料 发现好多都是T40或者更老的BIOS设置信息 不适合现在的主流以及新机型 于是找到分享该贴 希望对各位有所帮助 简洁的分割线 T
  • Python-错误与异常处理

    通常情况下 在try语句块中写我们想要的逻辑 发生错误和异常时Python解释器会采用raise方法即将异常抛出 except语句可以承接raise方法抛出的异常并对异常做出处理 Python中有三种异常捕获与处理形式 第一种 try ex
  • 为什么MySQL字符串不加引号索引失效?《死磕MySQL系列 十一》

    群里一个小伙伴在问为什么MySQL字符串不加单引号会导致索引失效 这个问题估计很多人都知道答案 没错 是因为MySQL内部进行了隐式转换 本期文章就聊聊什么是隐式转换 为什么会发生隐式转换 文章目录 系列文章 一 几大索引失效原因 二 从规
  • 解决git中文乱码

    1 配置git bash idea 随便找地方打开git bash 右击窗口进入options 分别将text选项的Locale改为zh CN character set改为UTF 8 如图所示 2 命令执行 我改了这个就好了 如果不行 在
  • C++基础知识(二)

    C 基础知识 二 文章目录 C 基础知识 二 1 指针与引用 2 日期与时间 3 cerr与clog 1 指针与引用 C 有两种指针运算符 一种是取地址运算符 另一种是间接寻址运算符 它们都是单目运算符 返回操作数的内存地址 如 var读作
  • Vulkan【15】图形管线(Graphics Pipline)

    创建图形管线 本节的代码是 14 init pipeline cpp 你越来越接近把这些拉到一起来渲染一个立方体 下一步是通过设置图形管道来配置GPU来进行渲染 一个图形管线由着色阶段 管线布局 渲染过程和固定功能管线阶段组成 您在前面的部
  • 一个栈的入栈序列是 a,b,c,d,e,则栈的不可能的输出序列是( ) 。

    一个栈的入栈序列是 a b c d e 则栈的不可能的输出序列是 a edcba b decbac dceab d abcde 堆栈讲究先进后出 后进先出 选项1是abcde先入栈 然后依次出栈 正好是edcba 选项2是abcd先依次入栈
  • python 数据清洗 豆瓣电影_python 数据清洗篇

    前面我们用pandas做了一些基本的操作 接下来进一步了解数据的操作 数据清洗一直是数据分析中极为重要的一个环节 本篇主要演示 python 数据清洗的数据合并 转换 过滤 排序 数据合并 在pandas中可以通过merge对数据进行合并操
  • 【Python搞搞轻量Blog】第一发 Flask入门

    我发现很多小伙伴一直想着有自己的一个博客 而且还想自己写一个 你们都这么爱折腾 我就给你们搞一个轻量级级别的Blog 准备 我们要用Python来写一套轻量级的博客 那么必须要有Python方面的基础 如果有HTML和CSS的基础食用更佳
  • Ren'Py引擎源代码解读(1)——脚本文件加载

    因为想要尝试把Ren Py移植到Cocos上 尽可能的使用原来的rpy文件 这就难免要解析rpy文件 因此就参考了一下Ren Py自己是怎么解析脚本的 文件加载 那么从哪里看起呢 先简要看一下Ren Py的启动过程 启动脚本肯定是根目录下的
  • 1.1.3 Hadoop生态系统

    1 1 3 Hadoop生态系统 2013 05 08 09 38 16 我来说两句 收藏 我要投稿 本文所属图书 gt Hadoop技术内幕 深入解析Hadoop Common和HDFS架构设计与实现原理 Hadoop技术内幕共两册 分别
  • CDMA 猫用AT命令发中文短信(C#)

    CDMA猫连PDU都不支持 只能发文本短信 而且发中文短信居然是UNICODE 无法在超级终端里输入 只能写程序 网上这个问题谈论地比较多 做起来比较累 还偶尔会出乱码 还是将C 的成功代码帖一下吧 void SendCHNSms stri
  • 力扣 - 1、俩数之和

    题目 给定一个整数数组 nums 和一个整数目标值 target 请你在该数组中找出 和为目标值 的那 两个 整数 并返回它们的数组下标 你可以假设每种输入只会对应一个答案 但是 数组中同一个元素在答案里不能重复出现 你可以按任意顺序返回答