每天加一句想说的话 :
今天第五天了,其实每天可以分享更多的知识,但是算法题,在精不在多,有人说刷满500题就可以进大厂了,其实不然,500道不同的算法题包含了多少种的思想和处理问题的方式,别说全会了,就会100题,也是非常不得了的一件事了。
算法包含的是解决问题的思路,和处理问题的方法,时间复杂度和空间复杂度是检验一个算法优劣的评价标准,有O(1)的牛逼算法,也有我经常写出来O(n²)和O(n³)的垃圾算法。但是我们都处理了一个问题,如果不管性能上的问题,我们都满足了这个需求。
有句很经典的话叫做,你别去动那些屎山一样的代码,那可能是几代人积累下来的宝贵财富,能跑进行,能抄就抄。
做算法是一个精益求精的过程,并不是写了多少道题,我就多牛逼了,都是需要通过不断的总结,反思,我写出了O(nlogn)的算法,很牛逼,我能不能在想办法来实现O(n)的算法来,同一个问题,我能不能再给出一种解决办法,这个办法可能没有优于之前的方法,但是他给了你另一种思路,这也是极好的。
希望大家在前进的道路上,敢于推翻自己,敢于超越自己 !
1、题目
2、分析
⑴ 、条件 :数组非空,并且给定的数组总是存在多数元素。。。。首先,我们分析,所谓多数元素就是数组中出现次数大于 n / 2的元素,那么,我们求出给定数组的 n / 2是多少
⑵、遍历数组,通过我们用for循环去遍历就可以了,因为这里我们知道数组大小,并且我们需要和循环中的变量作比较,所以用for循环很合适
⑶、这里我用了map去存储数组中的每个元素和出现的次数,key是元素,value是出现的次数,如果不包含就put进去,value默认为1,如果包含,就put进去,value是get key的值 + 1,遍历完成后我们就拥有了一个包含数组中所有元素以及该元素在数组中出现次数的map
⑷、最后我们遍历map,获取所有value值,判断是否大于 n/2 ,求出该数组中的多数元素
3、解题
- /**
- * 多数元素
- * 给定一个大小为n的数组nums,返回其中的多数元素.多数元素是指在数组中出现次数大于 [n/2]的元素
- *
- * @param nums
- * @return
- */
- public static int majorityElement(int[] nums) {
- int size = nums.length;
- //size=0 或者 size = 1,数组没有多数元素
- if (size == 1) return nums[0];
- int moreNum = size / 2;
- Map
map = new HashMap<>(); - for (int i = 0; i < size; i++) {
- if (!map.containsKey(nums[i])) {
- map.put(nums[i], 1);
- } else {
- map.put(nums[i], map.get(nums[i]) + 1);
- }
- }
- Set
> entries = map.entrySet(); - for (Map.Entry
entry : entries) { - if (entry.getValue() > moreNum) {
- return entry.getKey();
- }
- }
- return 0;
- }