赞
踩
原题如上,看到题目后第一个想法应该是最为基础的暴力求解,没什么方法可言,代码如下(c++):
- class Solution {
- public:
- vector<int> twoSum(vector<int>& nums, int target) {
- int i,j;
- for( i = 0;i < nums.size();i++){
- for(int j = i + 1;j < nums.size();j++){
- if(nums[i] + nums[j] == target){
- return {i,j};
- }
- }
- }
- return {};
- }
- };
暴力求解虽然简单,但时间复杂度却是相当大的,因为最坏的情况下,任意两个数都要被匹配一次。
对于这种题可以转化为求解值是否在vector容器中即(target - nums[i])用此方法可以降低一定的时间复杂度,但需要一定的c++库函数unordered_map的应用知识,如果不怎么熟悉的可以仔细阅读这篇文章unordered_map详解。
下面是详细的注解代码
- class Solution {
- public:
- vector<int> twoSum(vector<int>& nums, int target) {
- unordered_map<int,int> hashmap;//创建unordered_map容器
- for(int i = 0;i < nums.size();i++){
- auto it = hashmap.find(target - nums[i]);//查找vector中是否有相应数
- if(it != hashmap.end()){ // 找到对应数值
- return {it -> second,i};//将找到的数的键值和对应循环时的下标i输出
- }
- hashmap[nums[i]] = i;//没有找到相应数值,将数nums[i]的数值和下标存入到哈希表中
- }
- return {};//没有满足条件的一对数,返回空
- }
- };
该算法的优点是只需要遍历一次数组(从头开始遍历,当数组没有满足的值时哈希表跳转到当前值继续遍历);时间复杂度为O(N),即为遍历数组长度所需时间。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。