前言
算法的重要性不言而喻!区分度高!
现在学习的门槛低了,只有能上网每个人都可以学编程!培训班6个月就可以培养出来能干活的人,你怎么从这些人中脱颖而出?没错!就是学算法,学一些底层和基础的东西。
说的功利点是为了竞争,卷死对手。真心话说就是能提高自己的基础能力,为技术可持续发展做好充分的准备!!!
提前入门学习书籍:CPrimerPlus、大话数据结构
刷题网站
我是按照代码随想录提供的刷题顺序进行刷题的,大家也可以去刷leetcode最热200道,都可以
刷题嘛,最重要的就是坚持了!!!
画图软件
OneNote
这个要经常用,遇见不懂的流程的话就拿它画一画!
笔记软件
Typoral
题目
解析
一些限制
为什么不能使用数组和set来做哈希法呢?
我们来看下它们的局限
- 首先呢数组的大小是会受限制的,如果你的元素也很少的话,那又会很浪费
- set呢它是一个集合,里面存放的元素只能是一个key,而这个两数之和的题目,不仅要判断y是否存在而且还要记录它y的下标位置,所以set也不能用
此时就要选择另一种数据结构:map ,map是一种key value的存储结构,可以用key保存数值,用value在保存数值所在的下标。
哈希
又是找目标的对吧,那就要想到用哈希法了
思路
- 生成int数组存放结果的数组下标
- 临界条件,判断一些特殊情况(数组为空、数组长度为0)
- 创建HashMap,它的作用就是判断目标值target减去数组中的值得到的值是否在map集合内
- 存在于集合内,返回数组下标,不存在就把值放进去。放进去的规则key为target减去数组中的值,value为该值索引下标
- 通过循环,不断的让taget减去数组中的每一个数,把得到的值进行判断看它们是否在map集合中,在的话设置res数组返回数组下标,不在的话把得到的结果放到map中,之后继续重复
完整代码如下:
class Solution { public int[] twoSum(int[] nums, int target) { int[] res = new int[2]; if(nums == null || nums.length == 0){ return res; } HashMap<Integer,Integer> map = new HashMap<>(); for(int i = 0; i < nums.length; i++){ int temp = target - nums[i]; if(map.containsKey(temp)){ res[1] = i; res[0] = map.get(temp); } map.put(nums[i],i); } return res; } }