前言
算法的重要性不言而喻!区分度高!
现在学习的门槛低了,只有能上网每个人都可以学编程!培训班6个月就可以培养出来能干活的人,你怎么从这些人中脱颖而出?没错!就是学算法,学一些底层和基础的东西。
说的功利点是为了竞争,卷死对手。真心话说就是能提高自己的基础能力,为技术可持续发展做好充分的准备!!!
提前入门学习书籍:CPrimerPlus、大话数据结构
刷题网站
我是按照代码随想录提供的刷题顺序进行刷题的,大家也可以去刷leetcode最热200道,都可以
刷题嘛,最重要的就是坚持了!!!
画图软件
OneNote
这个要经常用,遇见不懂的流程的话就拿它画一画!
笔记软件
Typoral
题目
解析
给定两个数组,编写一个函数来计算它们的交集。
暴力
暴力法的话就是遍历两个数组,然后比较它们相等的话把这个元素放到一个新的集合中去,这样集合收集的就是两个数组的交集。这里时间复杂度为n的平方
依旧是hash
这里不能直接使用hash结构,而是使用了hashset,因为使用hash这个数据结构的前提是元素的个数是确定的,而这里很明显不知道数组有多少个元素 代码如下:
class Solution { public int[] intersection(int[] nums1, int[] nums2) { Set<Integer> set1 = new HashSet<Integer>(); Set<Integer> set2 = new HashSet<Integer>(); for (int num : nums1) { set1.add(num); } for (int num : nums2) { set2.add(num); } return getIntersection(set1, set2); } public int[] getIntersection(Set<Integer> set1, Set<Integer> set2) { if (set1.size() > set2.size()) { return getIntersection(set2, set1); } Set<Integer> intersectionSet = new HashSet<Integer>(); for (int num : set1) { if (set2.contains(num)) { intersectionSet.add(num); } } int[] intersection = new int[intersectionSet.size()]; int index = 0; for (int num : intersectionSet) { intersection[index++] = num; } return intersection; } }
为什么不用集合呢?
还是前面说的,如果使用数组来做哈希相关的题目,题目一定会限制数组的大小
而且如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费。
遇到哈希问题都用set不就得了,用什么数组啊?
占用空间更多了呗,速度比数组慢。而且set它把数值映射到key上还需要进行hash计算这样是很耗费时间的,数据量大的情况,差距是很明显的。
哈希小总结
快速判断一个元素是否出现在集合的时候,就要考虑哈希算法!
如果使用哈希集合存储元素,则可以在O(1) 的时间内判断一个元素是否在集合中,从而降低时间复杂度。
class Solution { public int[] intersection(int[] nums1, int[] nums2) { if (nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) { return new int[0]; } Set<Integer> set1 = new HashSet<>(); Set<Integer> resSet = new HashSet<>(); //遍历数组1 for (int i : nums1) { set1.add(i); } //遍历数组2的过程中判断哈希表中是否存在该元素 for (int i : nums2) { if (set1.contains(i)) { resSet.add(i); } } int[] resArr = new int[resSet.size()]; int index = 0; //将结果几何转为数组 for (int i : resSet) { resArr[index++] = i; } return resArr; } }
\