Blankj/awesome-java-leetcode

关于第一题思路1的表述问题

YdlNAU opened this issue · 1 comments

我看了代码之后才知道是怎么回事,这样表述如何?
利用 HashMap 作为存储,键为目标值减去当前元素值,索引为值,比如 i = 0 时,此时首先要判断 nums[0] = 2 是否在 map的key 中,如果不存在,那么插入键值对 key = 9 - 2 = 7, value = 0,之后当 i = 1 时,此时判断 nums[1] = 7 已存在于 map的key 中,那么取出此时 value = 0 作为第一个返回值,当前 i 作为第二个返回值,具体代码如下所示。

还有虽然思路二只有一个循环,但是为什么我测试了一个发现思路二反而更慢?

public class P01TwoSum {

/**
 * @param args
 */
public static void main(String[] args) {
	// TODO Auto-generated method stub
	int[] nums = {2, 7, 11, 15}; int target = 18;
	
	//伪代码  
	long startTime=System.nanoTime();   //获取开始时间  
	int[] res = twoSum1(nums, target);  //测试的代码段  
	long endTime=System.nanoTime(); //获取结束时间
	
	System.out.println("程序运行时间: "+(endTime-startTime)+"ns"); 
	
			
	long startTime1=System.nanoTime();   //获取开始时间  
	int[] res2 = twoSum2(nums, target);  //测试的代码段  
	long endTime1=System.nanoTime(); //获取结束时间
	
	System.out.println("程序运行时间: "+(endTime1-startTime1)+"ns"); 
	
	
}

public static int[] twoSum1(int[] nums, int target) {
	
	for (int i = 0; i < nums.length; i++) {
		for (int j =i + 1; j < nums.length; j++) {
			if (nums[i] + nums[j] == target) {
				return new int[] {i,j};
			}
		}
	}
	
	return null;
}

public static int[] twoSum2(int[] nums, int target) {
    int len = nums.length;
    HashMap<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < len; ++i) {
        if (map.containsKey(nums[i])) {
            return new int[]{map.get(nums[i]), i};
        }
        map.put(target - nums[i], i);
    }
    return null;
}

}

程序运行时间: 2356ns
程序运行时间: 36646ns

小数据并不能说明什么,可能你初始化 HashMap 就要花很多时间,但在数据量变大的时候和初始化相比时间就相形见绌了