原题连接:传送门

Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would have exactly one solution.

题目大意:

给一个数组和一个特定的值,返回数组中两个数的下标,使得这两个数的和等于给定的数,还要求给出的结果按顺序排放,如:

Given nums = [2, 7, 11, 15], target = 9,Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

这里我们对数组中的每个数都要保留两个信息,一个是数本身的值,一个是数的下标。因此我们可以定义一个结构体:

struct Node
{int val;int idx;
};

用val来存储数组中的数值,用idx来存储数的下标。

这是一个典型的双指针问题,将数组升序排序后,从左右两边向中间移动,检查两个位置上数的和,如果和等于给定的值target,说明找到了这对数,把下标保存在vector<int>中接口;如果和大于target,说明有指针位置的数较大,将右侧游标向左移动,左侧游标不动;如果和小于target,说明左侧游标位置的数较小,将左侧游标右移,右侧游标不动,直到找到合适的数对。

可是传过来的参数不是升序排列的,需要我们进行排序。C++中有一个函数sort,下面介绍下C++库中的sort函数。

1.定义:定义在<algorithm>头文件中;

2.函数原型:

  • template< class RandomAccessIterator >
    void sort( RandomAccessIterator first, RandomAccessIterator last );
  • template< class RandomAccessIterator, class Compare >
    void sort( RandomAccessIterator first, RandomAccessIterator last, Compare comp );

即sort有两个重载函数,一个需要两个参数:first和last;另一个需要三个参数,first、last和自定义比较函数comp。

sort函数对在[first,last)区间内的元素按照升序排列。函数对相同元素不一定保留原来的次序,同时,第一个函数使用<操作符进行比较,第二个函数使用comp进行比较。

3.参数:

  • first、last:要比较元素的范围,是一个迭代器;
  • comp:比较函数,如果第一个参数小于第二个参数返回true。自定义的函数必须满足如下形式:
    bool cmp(const Type1 &a, const Type2 &b);

4.返回值:none

5.时间复杂度:
O(N·log(N))

6.例子:

#include <algorithm>
#include <functional>
#include <array>
#include <iostream>int main()
{std::array<int, 10> s{5, 7, 4, 2, 8, 6, 1, 9, 0, 3};std::sort(s.begin(), s.end());for (int a : s) {std::cout << a << " ";} std::cout << '\n';std::sort(s.begin(), s.end(), std::greater<int>());for (int a : s) {std::cout << a << " ";} std::cout << '\n';
}

结果:

0 1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1 0

因此,我们需要给出自己的comp函数来比较Node:

bool cmp(Node a,Node b)
{return a.val<b.val;
}

只比较val值即可。

然后,就可以按照上面的描述写代码了:

struct Node
{int val;int idx;
};
bool cmp(Node a,Node b)
{return a.val<b.val;
}
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {vector<int> ret(2);vector<Node> nodes;for(int i=0;i<nums.size();i++){Node node;node.val=nums[i];node.idx=i;nodes.push_back(node);}sort(nodes.begin(),nodes.end(),cmp);for(int i=0,j=nodes.size()-1;i!=j;){int sum=nodes[i].val+nodes[j].val;if(sum==target){ret[0]=nodes[i].idx<nodes[j].idx?nodes[i].idx:nodes[j].idx;ret[1]=nodes[i].idx+nodes[j].idx-ret[0];break;}else if(sum<target)i++;elsej--;}return ret;}
};

从上面的代码中可以看到,如果没有sort一步,处理过程只需将nodes遍历一遍。

Leetcode1:Two Sum相关推荐

  1. LeetCode-1.Two Sum

    1.题目描述 Given an array of integers, return indices of the two numbers such that they add up to a spec ...

  2. Leetcode分类练习-查找(2)对撞指针

    对撞指针 leetcode1 Two Sum 题目描述 给出一个整型数组nums,返回这个数组中两个数字的索引值i和j,使得nums[i]+nums[j]等于给定的一个target值,两个索引不能相等 ...

  3. leetcode--1:(python)Two Sum

    2019.5.25:  #1 Given an array of integers, return indices of the two numbers such that they add up t ...

  4. 从leetcode1. 两数之和循序渐进(双指针,BST,哈希表)

    leetcode1. 两数之和 1.之前只知道桶排序那种标志数组,所以看到第一眼就想到那个方面去了.但在本题数组里面存储某个数出现的次数对该题是没有意义的,应该存储某个数出现的位置. 2.哈希表是优化 ...

  5. go build 编译报错 missing go.sum entry for module providing package

    go build 编译报错 missing go.sum entry for module providing package 解决方法 // 移除未使用的依赖 go mod tidy 再次编译,就可 ...

  6. pytorch之expand,gather,squeeze,sum,contiguous,softmax,max,argmax

    目录 gather squeeze expand sum contiguous softmax max argmax gather torch.gather(input,dim,index,out=N ...

  7. C语言计算e1 1/1! 1/2!,c语言程序填空 下面程序是计算sum=1+(1+1/2)+(1+1/2+1/3)+…(1+1/2...

    匿名用户 1级 2016-06-25 回答 <C语言>综合练习题一注意:以下"□"为空格,为回车一.单选题1.阅读以下程序,当输入数据的形式为:25,13,10,正确的 ...

  8. PyTorch 笔记(07)— Tensor 的归并运算(torch.mean、sum、median、mode、norm、dist、std、var、cumsum、cumprod)

    1. Tensor 归并运算函数 此类操作会使输出形状小于输入形状,并可以沿着某一维度进行指定操作,如加法, 既可以计算整个 tensor 的和,也可以计算 tensor 每一行或者 每一列的和, 常 ...

  9. [leetcode] Minimum Path Sum

    Minimum Path Sum Given a m x n grid filled with non-negative numbers, find a path from top left to b ...

最新文章

  1. Z-STACK的一些小内容
  2. RxJava使用(二)filter 操作符
  3. 解决sublime3的标签页乱码(小方块)
  4. PAT甲级1114 Family Property:[C++题解]结构体、并查集、测试点3、4、5有问题的进来!!
  5. react native基本调试技巧
  6. jcreator编译多个java_java用JCreator怎么都编译不过去!
  7. android sharedpreferences工具类
  8. SAP Spartacus的自定义静态页面
  9. oracle帮助文档_Spring Boot Config文档,使用IntelliJ IDEA的两种方法
  10. .net core 与ELK(4)后台运行els可视化工具和Kibana
  11. 商业领域中的IT技术应用之二-POS收款机及收款系统介绍
  12. javascript之js实现简单的无缝轮播图(可调节方向)
  13. python post 上传文件_Python脚本POST上传数据以及文件
  14. 个人域名备案详细流程(图文并茂)
  15. 我的世界php motd,我的世界动态motd配置教程
  16. LIN总线开发:智能雨量传感器
  17. 全国计算机等级考试二级教程与资料
  18. 17种Vue适用于移动端的ui框架
  19. 怎么设置wifi网页认证——时讯企业wifi
  20. C# —— 面向对象编程练习

热门文章

  1. matlab生成HEX文件-任意信号 大于64K长度
  2. 学好Java开发的关键七步
  3. 选哪个云计算平台部署自己的网站?
  4. IIS7 MVC网站生成、发布
  5. 关于重装系统后或打补丁后不能上网的问题的解决
  6. Dreamweaver cs3快捷键大全
  7. android如何导入活动,关于android:如何将活动值传递给另一个活动(Kotlin)
  8. 0 win10重装partition_教你在安装WIN10系统中所遇到问题处理方法
  9. python秒数变日期_将pandas日期列转换为已用秒数
  10. linux内存分配堆栈数据段代码段,linux – LD_PRELOAD堆栈和数据段内存分配