1 LeetCode Two Sum

本文介绍了一种解决两数之和问题的有效算法,该算法通过排序和二分查找来寻找数组中两个数相加等于特定目标值的下标。文章详细展示了使用快速排序对数组进行排序的方法,并通过二分查找找到匹配数值的过程。

题目:

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.

Example:

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
就是输出和为target的两个数的下标,有两个方案,一个是用HashMap,直接标记某个数是否存在,但是考虑到如果元素值很大,不能开那么大的数组,另一个方案是,对数组排序,二分查找对应的值的位置。我这里列出第二种。

另外遇到一个坑,单例测试都是对的,但是Run就WA了,报的错误有误导。后来发现是没有考虑连续输入,需要每次初始化。

#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;

class Solution {
public:

	void quickSort(vector<int>& s, int l, int r, vector<int>&id)
	{
		if (l < r)
		{
			int i = l, j = r, temp = s[l], tempid = id[l];
			while (i < j)
			{
				while (i < j && s[j] >= temp) // 从右向左找第一个小于x的数  
					j--;
				if (i < j)
				{
					id[i] = id[j];
					s[i++] = s[j];
				}
				while (i < j && s[i]< temp) // 从左向右找第一个大于等于x的数  
					i++;
				if (i < j)
				{
					id[j] = id[i];
					s[j--] = s[i];
				}
			}
			s[i] = temp;
			id[i] = tempid;
			quickSort(s, l, i - 1, id); // 递归调用  
			quickSort(s, i + 1, r, id);
		}
	}


	vector<int> twoSum(vector<int>& nums, int target) {
		vector<int> ans(0);
		vector<int> id(0);
		for (int i = 0; i < nums.size(); i++)
			id.push_back(i);
		quickSort(nums, 0, nums.size() - 1, id);
		for (int i = 0; i < nums.size(); i++)
		{
			int needFind = target - nums[i];
			int index = BinarySearch(needFind, 0, nums.size() - 1, nums, id, i);
			if (index != -1)
			{
				ans.push_back(id[i]);
				ans.push_back(index);
				return ans;
			}
		}
	}

	int BinarySearch(int needFind, int left, int right, vector<int>& nums, vector<int>& id, int index) {
		while (left < right)
		{
			int mid = (left + right) / 2;
			if (needFind == nums[mid])
			{
				if (id[index] != id[mid])
					return id[mid];
				else
					if (nums[mid + 1] == nums[mid])
						return id[mid + 1];
					else return id[mid - 1];
			}
			if (needFind < nums[mid])
			{
				right = mid - 1;
			}
			else
			{
				left = mid + 1;
			}
		}
		if (nums[left] == needFind) return id[left];
		else return -1;
	}
};

int main()
{
	Solution *s = new Solution();
	vector<int> v;
	v.push_back(3);
	v.push_back(2);
	v.push_back(3);

	vector<int> ans = s->twoSum(v, 6);
	cout << ans[0] <<" " << ans[1];
	getchar();
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值