持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情
前言
算法的重要性不言而喻!区分度高!
现在学习的门槛低了,只有能上网每个人都可以学编程!培训班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;
}
}