1.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].
思路: 1.暴力破解(肯定可以做一部分的题目,但是并不是全都可以,肯定会时间超出)
2.问题集中于 相等的数字不能重复使用,两数相加要等于目标数字;
采取存1找1的方式,由于最后是获取的位置信息,所以我们可以将数组中的数字的位置存储在一个数组中.
使用 unordered_map 函数 就是hashmap unordered_map标准库
c++代码
#include<iostream>
#include<vector>
#include<Windows.h>
#include<unordered_map>
using namespace std;
class Solution {
public:
vector<int> nums = { 5,4,3,2,4,2 };
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> m;//相当于词典 第一个是key 第二个是元素
vector<int> res;
for (int i = 0; i < nums.size(); ++i) {
m[nums[i]] = i;
}
for (int i = 0; i < nums.size(); ++i) {
int t = target - nums[i];
//printf("%d\n", m.count(t));
if (m.count(t) && m[t] != i) {//m.count(t) 查找是否有这个数字 可以选择不使用 map函数 然后 重新自定义一个函数 判断是否存在需要查找的那个数字
res.push_back(i);//第一个数字的位置
res.push_back(m[t]);//第二个数字的位置
break;
}
}
return res;
}
void printList(vector<int> nums) {
for (int i = 0; i < nums.size(); i++) {
printf("%d\t", nums[i]);
}
}
};
int main(void) {
Solution s;
vector<int> resu(5);
resu = s.twoSum(s.nums, 5);
s.printList(resu);
system("pause");
}
java代码 实现和 c++相差不大 都是使用了 map
import java.util.HashMap;
import java.util.Map;
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i], i);
}
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement) && map.get(complement) != i) {
return new int[] { i, map.get(complement) };
}
}
throw new IllegalArgumentException("No two sum solution");
}
}
public class TwoSum {
public static void main(String[] args){
Solution s = new Solution();
int[] nums = {5,4,3,2,1,2,4,5,6};
int[] resu ;
resu = s.twoSum(nums,8);
for(int i=0;i<resu.length;i++){
System.out.println(resu[i]);
}
}
}