害,想着很久没有刷题了,感觉对自己脑子不好,然后我就打算今天去刷刷题。本想着做做基础题的(简单),我就去打开我注册了一年但是从来没有刷过题的leetcode网站。

然后直接的就在上面找了一个简单难度的题目,就开始上手了,确实简单的题目容易理解爆破,看起来就知道for循环一下就可以了(只是for的够不够多),然后我看到第一题两数之后,脑子里一下想到了用双重for循环求解,其实一般人看到这种题目都是这样的解法,然后我也是,我一开始本来是打算去用暴力的,但是后来发现不知道怎么输入,因为之前做多了pta,所以就不太懂这个Leetcode。然后我就直接去看评论大佬的代码了,看到了一个大佬用哈希表做的,时间复杂度还很低,挺不错的,然后就试着去理解下,下面就说下这个大佬的代码吧。

我的理解:

这个大佬是思路是和大部分人不太一样,我觉得是逆向思维,我们一般人用双重for循环是直接判断数组里面两个数相加是不是等于目标数的,然后这个大佬是直接通过目标数减去当前下标数来获得补数,然后再遍历数组查看有没有和补数一样的数,有的话那就说明这两个数之和是目标数,没有的话就返回空数组。这个大佬之所以可以一个for求解是因为用到了hashmap这个数据结构,它再hashmap存放的键名是补数,键值是当前减数的下标,然后在循环的时候就判断当前下标的元素有没有在哈希表上,如果有,那么就命中了,直接可以拿到下标;如果没有,那就继续将当前元素的补数存到哈希表上,以此类推,直到最后return回去就可以了(可能说的不是很懂,但是大家可以看看代码和题目再结合我的理解)。

代码:

import java.util.HashMap;
import java.util.Map;

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] indexs = new int[2];
        
        // 建立k-v ,一一对应的哈希表
        HashMap<Integer,Integer> hash = new HashMap<Integer,Integer>();
        for(int i = 0; i < nums.length; i++){
            if(hash.containsKey(nums[i])){
                indexs[0] = i;
                indexs[1] = hash.get(nums[i]);
                return indexs;
            }
            // 将数据存入 key为补数 ,value为下标
            hash.put(target-nums[i],i);
        }
        // // 双重循环 循环极限为(n^2-n)/2 
        // for(int i = 0; i < nums.length; i++){
        //     for(int j = nums.length - 1; j > i; j --){
        //         if(nums[i]+nums[j] == target){
        //            indexs[0] = i;
        //            indexs[1] = j; 
        //            return indexs;
        //         }
        //     }
        // }
        return indexs;
    }
}

附:

题目:https://leetcode-cn.com/problems/two-sum/

HashMap的一些API:https://www.runoob.com/java/java-hashmap.html

  • alipay_img
  • wechat_img
关注微信公众号:软件阿威
最后更新于 2022-01-29