leetcode之TwoSum问题

TwoSum问题:

我的思路是,首先排序,然后使用二分查找查找问题。

但是遇到一个问题,此处要输出的是下标,而经过排序后数组的下标变了,C++使用不熟练,map还不太理解,所以专门用了一个数组,专门用来存放下标。笨办法啦。


#include "stdafx.h"
#include <iostream>
#include <map>
#include <vector>


using std::vector;


vector<int> twoSum(vector<int> &numbers, int target);
void insert(vector<int> &numbers, vector<int> &guanlian);
int binarySearch(vector<int> &numbers, int target,int left,int right);




int _tmain(int argc, _TCHAR* argv[])
{
vector<int> nums = { -1, -2, -3, -4, -5 };

int tar = -8;
vector<int> result = {-1,-1};
result = twoSum(nums, tar);
for (auto i = 0; i < result.size(); i++)
std::cout << result[i] << std::endl;
return 0;
}


vector<int> twoSum(vector<int> &numbers, int target) {


vector<int> index;
vector<int> guanlian(numbers.size());
for (int j = 0; j < numbers.size(); j++)
guanlian[j] = j;
insert(numbers, guanlian);
auto n = numbers.size();
for (auto i = 0; i <n; i++)
{
int another = target - numbers[i];
int res2=binarySearch(numbers, another, i + 1, n - 1);
if (res2 != -1)
{
if (guanlian[i] < guanlian[res2])
{
index.push_back(guanlian[i] + 1);
index.push_back(guanlian[res2] + 1);
}
else
{
index.push_back(guanlian[res2] + 1);
index.push_back(guanlian[i] + 1);


}
return index;
}
}
}
void insert(vector<int> &numbers, vector<int> &guanlian)
{
auto n = numbers.size();
for (auto j = 1; j<n; j++)
{
auto key = numbers[j];
auto thekey = j;
int i = j - 1;
while (i >= 0 && numbers[i]>key)
{
numbers[i + 1] = numbers[i];
guanlian[i + 1] = guanlian[i];
i--;
}
numbers[i + 1] = key;
guanlian[i + 1] = thekey;
}
}


int binarySearch(vector<int> &numbers, int target, int left, int right)
{
if (left> right)
return -1;
if (left == right)
{
if (numbers[left] == target)
return left;
else
return -1;
}
else if (target == numbers[(left + right) / 2])
return ((left + right) / 2);
else if (target < numbers[(left + right) / 2])
binarySearch(numbers, target, left, (left + right) / 2 - 1);
else if (target > numbers[(left + right) / 2])
binarySearch(numbers, target, (left + right) / 2 + 1, right);

}



上文中排序用到的是插入排序,该算法中主要问题就是排序话费时间较长,所以算法使用时间就是排序所用时间,空间的话用了O(n)。如果改为快速排序的话时间是O(nlogn),但是最好的方法是使用hash,后续写

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值