前言
之前小六六一直觉得自己的算法比较菜,算是一个短板吧,以前刷题也还真是三天打鱼,两天晒网,刷几天,然后就慢慢的不坚持了,所以这次,借助平台的活动,打算慢慢的开始开刷,并且自己还会给刷的题总结下,谈谈自己的一些思考,和自己的思路等等,希望对小伙伴能有所帮助吧,也可以借此机会把自己短板补一补,希望自己能坚持下去呀
链表的合集
题目
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
题解
啊哈哈 我相信大家只要入了这个行,两数之和这题大家估计都刷了几十遍了,啊哈哈 都是大家梦开始的地方,六六自己也是刷了无数次这题了,虽然这题我感觉大部分人会做,但是小六六,还是要写,致敬经典吧,说不定面试的时候,看你顺眼就给这题你写呢
代码
注意到方法一的时间复杂度较高的原因是寻找 target - x 的时间复杂度过高。因此,我们需要一种更优秀的方法,能够快速寻找数组中是否存在目标元素。如果存在,我们需要找出它的索引。
使用哈希表,可以将寻找 target - x 的时间复杂度降低到从 O(N)O(N) 降低到 O(1)O(1)。
这样我们创建一个哈希表,对于每一个 x,我们首先查询哈希表中是否存在 target - x,然后将 x 插入到哈希表中,即可保证不会让 x 和自己匹配。
接下来需要明确两点:
- map用来做什么
- map中key和value分别表示什么
map目的用来存放我们访问过的元素,因为遍历数组的时候,需要记录我们之前遍历过哪些元素和对应的下表,这样才能找到与当前元素相匹配的(也就是相加等于target)
接下来是map中key和value分别表示什么。
这道题 我们需要 给出一个元素,判断这个元素是否出现过,如果出现过,返回这个元素的下标。
那么判断元素是否出现,这个元素就要作为key,所以数组中的元素作为key,有key对应的就是value,value用来存下标。
所以 map中的存储结构为 {key:数据元素,value:数组元素对应的下表。
package com.six.finger.leetcode.nine; import java.util.HashMap; import java.util.Map; import java.util.Set; public class TwoSum { public static void main(String[] args) { } public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> map=new HashMap(); for (int i = 0; i < nums.length; i++) { if (map.containsKey(target-nums[i])){ int[] res=new int[2]; res[0]=i; res[1]=map.get(target-nums[i]); return res; }else { map.put(nums[i],i); } } return null; } }
结束
今天这题就结束了,很简单的一题,哈哈 祝大家刷题的时候 梦开始的地方是他,梦结束的地方也是他,我是小六六,三天打鱼,两天晒网!