Leetcode【1】:Two Sum

来源:互联网 发布:免费云数据库mysql 编辑:程序博客网 时间:2024/04/18 13:07
题目:给一个int数组和target,找到两个数之和=target,返回其下标。(以0开始,并且index1<index2)

1.两层循环暴力解法。时间O(n*n),空间O(1)。不能AC。

class Solution{  public:vector<int> twoSum(vector<int> &numbers, int target){vector<int> ret(2,0);for(int i=0;i<numbers.size();i++){  for(int j=i+1;j<numbers.size();j++)  {if(numbers[i]+numbers[j]==target){  ret[0]=i+1;  ret[1]=j+1;  return ret;}  }}return ret;}};

2.考虑到排序可能降低时间开销,但是需要保存原来的index。时间O(n*logn),空间O(n)。AC。

struct Node{int val;int pos;};//保存indexbool comp(const Node & m, const Node & n){return m.val<n.val;}//比较函数class Solution{public:vector<int> twoSum(vector<int> &numbers, int target){int start,end,len;len=numbers.size();start=0;end=len-1;vector<int> res;vector<Node> list;for(int i=0;i<len;i++){Node temp;temp.val=numbers[i];temp.pos=i+1;list.push_back(temp);}//建立新的vector数组,空间花销sort(list.begin(),list.end(),comp);while(start<end){int sum=list[start].val+list[end].val;if(sum>target)end--;else if(sum<target)start++;else{if(list[start].pos>list[end].pos){int tem;tem=list[end].pos;list[end].pos=list[start].pos;list[start].pos=tem;}//要求index1<index2res.push_back(list[start].pos);res.push_back(list[end].pos);return res;}}return res;}};


0 0
原创粉丝点击