当前位置: 首页 > news >正文

NC61 两数之和【牛客网】

文章目录

  • 零、原题链接
  • 一、题目描述
  • 二、测试用例
  • 三、解题思路
    • 3.1 排序+双指针
    • 3.1 散列
  • 四、参考代码
    • 4.1 排序+双指针
    • 4.2 散列

零、原题链接


NC61 两数之和

一、题目描述

在这里插入图片描述

二、测试用例

在这里插入图片描述

三、解题思路

3.1 排序+双指针

  1. 基本思路:
      先对序列进行排序,然后使用双指针从头和尾进行操作。
  2. 具体思路:
    • 建立值到下标的映射;
    • 序列从小到大排序;
    • 定义双指针 ij ,指针 i 表示头,指针 j 表示尾,迭代直到 i>j
      • 如果两个指针的值相加等于目标,则返回对应值在序列的位置;
      • 如果两个指针的值相加大于目标,则 j-- ;【想办法减小两个值的和】
      • 如果两个指针的值相加等于目标,则 i++ ;【想办法增加两个值的和】

3.1 散列

  1. 基本思路:
      每次遍历到一个元素,从遍历过的数中看看是否能找到目标减去该元素的值。
  2. 具体思路:
    • 遍历所有元素
    • 如果可以在 map 中找到目标值减去该元素的值,则返回两个元素的下标;
    • 如果没有找到,则将该元素按照 {元素值,下标} 的方式插入到 map 中;

四、参考代码

4.1 排序+双指针

时间复杂度: O ( n l o g n ) \Omicron(nlog\;n) O(nlogn)
空间复杂度: O ( n ) \Omicron(n) O(n)

#include <functional>
#include <numeric>
#include <utility>
#include <vector>
class Solution {public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param numbers int整型vector* @param target int整型* @return int整型vector*/vector<int> twoSum(vector<int>& numbers, int target) {int n = numbers.size();vector<pair<int, int>> numtoi(n);vector<int> ans;for (int i = 0; i < n; i++) {numtoi[i] = make_pair(numbers[i], i + 1);}sort(numtoi.begin(), numtoi.end(), [&](const pair<int, int>& x,const pair<int, int>& y) {return x.first < y.first;});int i = 0, j = n - 1;while (i < j) {if (numtoi[i].first + numtoi[j].first == target) {ans.emplace_back(numtoi[i].second);ans.emplace_back(numtoi[j].second);if (ans[0] > ans[1])swap(ans[0], ans[1]);break;} else if (numtoi[i].first + numtoi[j].first < target) {i++;} else {j--;}}return ans;}
};

4.2 散列

时间复杂度: O ( n ) \Omicron(n) O(n)
空间复杂度: O ( n ) \Omicron(n) O(n)

#include <functional>
#include <numeric>
#include <unordered_map>
#include <utility>
#include <vector>
class Solution {public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param numbers int整型vector* @param target int整型* @return int整型vector*/vector<int> twoSum(vector<int>& numbers, int target) {unordered_map<int, int> m;for (int i = 0; i < numbers.size(); i++) {int rest = target - numbers[i];if (m.count(rest) == 1) {return {m[rest] + 1, i + 1};} else {m.emplace(numbers[i], i);}}return {};}
};

相关文章:

  • 【C】C程序内存分配
  • 用DeepSeek辅助法律文件起草
  • fme条件属性值
  • 将视频中的音乐传到qq音乐上听
  • 第10章 输入与输出流
  • Redis实现分布式锁的原始方式详解:从入门到实践
  • C++(23):容器类<vector>
  • 聊天的表情包+发小文件+图片操作
  • 《P5283 [十二省联考 2019] 异或粽子》
  • Hugo 安装保姆级教程(搭建个人blog)
  • 软件架构设计--期末复习
  • HiTool机顶盒刷机提示:网络下载TFTP超时,可能的原因如下
  • volatile
  • DeepSeek 赋能太空探索:从轨道优化到星际开拓的 AI 革命
  • DAY 29 复习日:类的装饰器
  • tauri2项目动态添加 Sidecar可行性方案(运行时配置)
  • 高能数造闪耀 CIBF 2025,以创新技术引领新能源智造新征程
  • 基于MCP的AI Agent应用开发实践
  • 【ComfyUI】关于ComfyUI的一些基础知识和入门设置以及快捷键小技巧【简单易懂】
  • 通过串口设备的VID PID动态获取串口号(C# C++)
  • 国家统计局:下阶段要继续发挥宏观政策作用,促进价格合理回升
  • 证监会副主席李明:近期将出台深化科创板、创业板改革政策措施
  • 中国旅游日|上天当个“显眼包”!低空经济的“飞”凡魅力
  • 意德首脑会谈,梅洛尼警告欧盟绿色政策面临“工业荒漠化”
  • 纽约市长称墨海军帆船撞桥已致2人死亡,撞桥前船只疑似失去动力
  • 中国纪检监察刊文:力戒形式主义官僚主义关键是要坚持实事求是