leetcode刷题心得1

1.两数之和
题目内容
面对这一题第一反应是BF,嵌套for实现对数组的多次扫描,时间复杂度为O(n^2),好处是空间复杂度低。但是数据量变大之后性能会很糟糕,所以需要空间换时间。这一思路下首先想到的是将数组放入HashMap中,将数组的值作为key,位置作为value。之后通过再次遍历数组快速找到答案,总共需要遍历两边数组。这样做的话要是出现重复数字怎么办,这时候再次读题,发现了题目的严谨性。题目中说每种输入只会对应一种答案,那么重复数字可以考虑到分为三种情况:

  • 第一种该数字不在答案中,那么转换为HashMap时后面出现的覆盖掉前面出现的也不会对答案造成什么影响。

  • 第二种该数字为两个答案数字中的一个,那么答案就不唯一了与题目不符。

  • 第三种该数字只出现两次,且为答案的两个数字例如出现两个2,target为4。此时转换为HashMap后,后面出现的会覆盖掉前面出现的。但是后面还会再次重头再次扫描数组,再次扫描数组的时候就可以获得先出现的位置,HashMap中存储着后出现的位置,也可以解决问题。
    附上代码如下:

import java.util.*;
class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> number=new HashMap<>();
        int[] result=new int[2];
        for(int i=0;i<nums.length;i++)
            number.put(nums[i],i);
        for(int i=0;i<nums.length;i++)
        {
            
            if ((number.get(target-nums[i])!=null)&&(number.get(target-nums[i])!=i))
            {
                 result[0] = i;
                 result[1] =number.get(target-nums[i]);
                 return result;
            }
        }
         return null;    
    }
    
}

官方答案中
判断HashMap中是否有key的之后采用的方法是map.containsKey(complement),
在发现没有答案时采用了抛出异常 java.lang.IllegalArgumentException的方法来返回throw new IllegalArgumentException(“No two sum solution”);
匿名数组的写法new int[] { i, map.get(complement) }mark一下。

官方答案中还出现了一种遍历数组一次达到目的的方法。
遍历一次的具体过程是,边向HashMap中插入的同时边比较之前插入的元素,从而实现先遍历到答案中排在后面的元素,通过查找HashMap得到排在前面的答案的位置。

import java.util.*;
class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> number=new HashMap<>();
        for(int i=0;i<nums.length;i++)
        {
            if(number.containsKey(target-nums[i])&&number.get(target-nums[i])!=i)
                return new int[] {number.get(target-nums[i]),i};
            number.put(nums[i],i);
        }
        
        //return null;
        throw new IllegalArgumentException("no two sum solution");
    }
}

猜你喜欢

转载自blog.csdn.net/osa1993/article/details/88598148