1. 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,看数组中是否有两个数之和=target,返回这两个数的下标。
法一:暴力法
直接双重循环遍历数组,看是否满足结果即可,时间复杂度O(n^2)
public class Solution {
public int[] twoSum(int[] nums, int target) {
for(int i=0;i<nums.length;i++)
for(int j=i+1;j<nums.length;j++)
if(nums[i]==target-nums[j])
{
return new int[] {i,j};
}
throw new IllegalArgumentException("No solution");
}
}
什么是Hash?请自行百度,简而言之就是一种数据结构,一个key对应一个value,这样查询复杂度降低,不用遍历。这里用C++Map实现,这里的Map是一个红黑数,查询的复杂度为O(logn)
#include <iostream>
#include <stdio.h>
#include <vector>
#include <map>
using namespace std;
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target)
{
vector<int> ans;
map<int,int> myMap;//建立一个map
for(int i=0;i<nums.size();i++)
{
if(myMap.count(target-nums[i]))//如果找到了另外一个数字,则返回
{
ans.push_back(myMap[target-nums[i]]);
ans.push_back(i);
return ans;
}
else
myMap.insert(pair<int,int>(nums[i],i));//否则,将数字插入map中
}
return ans;
}
};
int main()
{
Solution a;
vector<int> num;
vector<int>::iterator it;
num.push_back(2);
num.push_back(3);
a.twoSum(num,5);
return 0;
}