博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1. Two Sum
阅读量:4957 次
发布时间:2019-06-12

本文共 2272 字,大约阅读时间需要 7 分钟。

1. 问题描述

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.

Example:

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

UPDATE (2016/2/13):

The return format had been changed to zero-based indices. Please read the above updated description carefully.

Tags: Array Hash Table

Similar Problems: (M) 3Sum (M) 4Sum (M) Two Sum II - Input array is sorted (E) Two Sum III - Data structure design

2. 解答思路

2.1. 先思考

  • 合法性判断:数组是否为空、数组元素个数是否>=2、target>=0?(想多了,因为题目说You may assume that each input would have exactly one solution.)
  • 数组是否排序?(why这样想? 因为如果是排序数组,只需从头、尾分别向中间靠拢便可找到答案)
  • 数组中是否含有重复的数?(why这样想? 考虑到是个整数数组、且下标位置也是整数,且要进行排序,而map内部本身就是按序存储。若不重复,可用map;若重复,可用multimap)
  • 注意:返回的不是找到的数,而是数的位置,故排序前,需保存下各个数字在数组中的次序

2.2. 算法

  • 先对数组进行排序,设为numsSorted
  • 令pFir指向排序后的数组的头,pSec指向排序后的数组尾部,sum = nutmsSorted[pFir] + numsSorted[pSec];
  • 若sum < target,则pFir++;若sum > target,则pSec--;若sum == target,则返回pFir,pSec.

3. 代码

1 #include 
2 #include
3 using namespace std; 4 class Solution { 5 public: 6 vector
twoSum(vector
& nums, int target) { 7 std::multimap
idx2Num; 8 std::vector
::iterator itVec = nums.begin(); 9 int idx = 0;10 while (itVec != nums.end())11 {12 idx2Num.insert(std::make_pair(*itVec, idx));13 idx++;14 itVec++;15 }16 std::vector
numsSorted; 17 std::multimap
::iterator itMap_Fir = idx2Num.begin();18 std::multimap
::iterator itMap_Sec = idx2Num.end();19 itMap_Sec--;20 21 int sum = itMap_Fir->first + itMap_Sec->first;22 while (sum != target)23 {24 if (sum > target)25 {26 itMap_Sec--;27 }28 else29 {30 itMap_Fir++;31 }32 sum = itMap_Fir->first + itMap_Sec->first;33 }34 numsSorted.push_back(itMap_Fir->second);35 numsSorted.push_back(itMap_Sec->second);36 return numsSorted;37 38 }39 };

4. 反思

本算法对数组进行排序采用了取巧的方法,即使用多重map。

若不用map,对Vector进行排序可采用:

  • 方法1:std::sort(nums.begin(), nums.end());//需引入#include <algorithm>
  • 方法2:自己写排序函数

 

转载于:https://www.cnblogs.com/whl2012/p/5575083.html

你可能感兴趣的文章
语音合成最新进展
查看>>
[BZOJ1000] A+B Problem
查看>>
UVA 1149 Bin Packing 二分+贪心
查看>>
kuangbin大佬的高斯消元模板
查看>>
ELK部署
查看>>
通过storyboard设置cell
查看>>
mongodb write 【摘自网上,只为记录,学习】
查看>>
Configuration Extensions - 简化配置,让你配置支持变量
查看>>
Java安全 – JCE Blowfish算法报错
查看>>
Navicat 12 破解方法
查看>>
中国大学MOOC-数据结构基础习题集、05-2、Saving James Bond - Easy Version
查看>>
LeetCode:36. 有效的数独
查看>>
DEV:GridControl 筛选复选框 Checked Dropdown更改数据源
查看>>
第九节 字符串指针(十)
查看>>
生成php所需要的APNS Service pem证书的步骤
查看>>
SQL语句case when外用sum与count的区别
查看>>
lua 迭代器 iterator
查看>>
Oracle_merge into 中 using 后的查询表如果有参数的情况
查看>>
3Sum Closest
查看>>
Java 两次MD5
查看>>