给定一个整数数组 nums
和一个目标值 target
,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
三种解法:
第一种:我就做出来了第一种,没错就是暴力,直接二话不说来个循环,瞬间解决。但是题肯定不会这么简单,于是想了怎么能减少时间复杂度,想了很多方式都没有满意的,也考虑通过排序来做,不过没有太好的思路。于是看了官方解答
第二种:在查找的时候把时间复杂度变为O(1),使用哈希表来查找,先加入到map中再查找,需要遍历两遍哈希表
第三种:更快,直接再建立map的时候就进行查找,当map结束就结束了,这个真是硬核。买了佛冷-_-.
PS:这个LeetCode和提交方式和ACM不一样,搞得我烦的一批,以下代码并不能直接使用。
开始在LeetCode上刷题了,希望能坚持下来,人生苦短,多多刷题。
/************************************************************************
*
* 文件名:1-两数之和.cpp
*
* 文件描述:给定一个整数数组nums和一个目标值target。请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
*
* 创建人: fdk
* 时 间: 2019-01-03
*
* 版本号:1.0
*
* 修改记录:暂时没想到好的方法,那就只能大力出奇迹了
*
************************************************************************/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#include<limits.h>
#define max 100
using namespace std;
int main()
{
/*目标输入*/
int num[] = {2, 7, 11, 15};
int target = 9;
int i, j, length;
length = sizeof(num) / sizeof(num[0]);
/*暴力破解*/
for (i = 0; i < length; i++)
{
for (j = i + 1; j <length; j++)
{
if (num[i] + num[j] == target)
{
cout << i << " " << j;
}
}
}
return 0;
}
/**
*
*
*
**/
import java.util.*;
public class 两数之和1 {
/*遍历两遍哈希表
* 第一次存表
* 第二次查找表
*/
public static 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 static int[] twoSum2(int[] nums, int target)
{
Map<Integer, Integer> map = new HashMap<>();
/*边加入边查找*/
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)};
}
map.put(nums[i], i);
}
throw new IllegalArgumentException("No two sum solution");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int [] nums = {2, 7, 11, 15};
int target = 9;
int [] a1 = twoSum(nums, target);
int [] a2 = twoSum2(nums, target);
for (int i: a1)
{
System.out.println(a1[i]);
}
System.out.println("------------------------");
for (int i: a2)
{
System.out.println(a2[i]);
}
}
}