Problem
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, and you may not use the same element twice.
说明:给定一个数组和一个数字target,在数组中找出两个数字使得两数之和等于给定的target值,并返回两个数字在数组中的下标。
[Example]
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
Answer
方法一:使用二重循环遍历数组。时间复杂度为O(n^2)
,额外空间复杂度0
;
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> ans;//存放结果下标
for(int i=0;i<nums.size()-1;i++){
for(int j=i+1;j<nums.size();j++){
if(nums[i]+nums[j]==target){//找到确定的两个数
ans.push_back(i);
ans.push_back(j);
return ans;
}
}
}
return ans;//最后未找到,返回空
}
};
方法二:使用结构体记录数组元素的初始下标以及数据;通过sort函数排序,然后使用两个指针i,j分别指向数组头和尾部;当array[i]+array[j]>target时说明array[j]数值较大此时j–;当array[i]+array[j]<target时说明arraay[i]较小,i++;否则相等即找到这两个数;循环结束条件:i<j。
时间复杂度:一次初始化结构体O(n)
,sort函数排序时间复杂度为O(nlogn)
,最后遍历一遍数组即可得出答案,时间复杂度为O(n)
;所以整个程序的时间复杂度为O(nlogn)
。
空间复杂度为:新创建一个结构体数组即O(n)
。
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int max_num=10000;
struct Node{
int data;
int index;
}tmp[max_num];
bool cmp(struct Node a,struct Node b){
return a.data<b.data;
}
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> ans;
//初始化结构体数组
for(int i=0;i<nums.size();i++){
tmp[i].data=nums[i];
tmp[i].index=i;
}
//根据数据从小到大排序
sort(tmp,tmp+nums.size(),cmp);
//遍历一遍数组
for(int i=0,j=nums.size()-1;i<j;){
if(tmp[i].data+tmp[j].data==target){//找到元素
ans.push_back(tmp[i].index);
ans.push_back(tmp[j].index);
break;
}else if(tmp[i].data+tmp[j].data<target)i++;//两数之和小于target
else j--;// 两数之和大于target
}
return ans;
}