leetcode | 01 两数之和

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum

思路:
根据题目可以知道,最多只需要知道两个重复的数的位置就可以完成【3,3】 target=6。这种检测。
另一方面,如果可选集过大,则需要用hash表进行快速检索。另一方面为了存储相同key的不同value值,需要将Integer[2]作为value值放在对应key处。

public int[] twoSum(int[] nums, int target) {
		 HashMap<Integer,Integer[]> map=new HashMap<Integer,Integer[]>();
		 int temp=0;
		 int result[]= {99999,99999};
		 int flag=0;
		 Integer[] tempkey=new Integer[2];
		 Integer[][] key=new Integer[15000][2];
		 for(int i=0;i<=nums.length-1;i++) {
			 if(map.containsKey(nums[i])) {//遇到key值相同的时候,将第二个value值和之前的较大的value值进行比较。
				key[i]=map.get(nums[i]);
				if(i<key[i][1])key[i][1]=i;//如果新的value值较小则将第二个换成较小的value值
				map.put(nums[i], key[i]);
			 }else {
				 key[i][0]=i;//如果是新的key值,则进行新的添加
				 key[i][1]=99999;		 
				 temp=nums[i];
				 map.put(temp,key[i]);
			 }
		 }
		 for(int i=nums.length-1;i>=0;i--) {
			 temp=nums[i];
			 if(map.containsKey(target-temp)) {
				 tempkey=map.get(target-temp);
				 if(temp==target-temp&&tempkey[1]!=99999) {//如果是两个相同的key值进行相加,需要判断是否有两个不同的数字可供选择
						 result[0]=tempkey[0];
						 result[1]=tempkey[1];
						 return result;
				 }else if(map.get(target-temp)[0]!=map.get(temp)[0]) {
					 result[0]=i;
					 result[1]=map.get(target-temp)[0];
					 if(result[0]>result[1]) {
						 temp=result[0];
						 result[0]=result[1];
						 result[1]=temp;
					 }
					 return result;
				 }
			 }
			 
			 
		 }
		return result;
	    }

结果:在这里插入图片描述

代码评价:因为hashmap存储的是key[][]的key[i]的地址,而这个是一个指针,所以需要一个很大的空间存储key[][]。另一个方面,初始化为999999也是一个败笔。

©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页