害,想着很久没有刷题了,感觉对自己脑子不好,然后我就打算今天去刷刷题。本想着做做基础题的(简单),我就去打开我注册了一年但是从来没有刷过题的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
Comments NOTHING