当前位置: 首页 > news >正文

中邮通建设咨询有限公司官方网站东莞做网站公司电话

中邮通建设咨询有限公司官方网站,东莞做网站公司电话,重庆大足网站建设,淄博网站题目链接:https://leetcode.cn/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof/ 1. 题目介绍(39. 数组中出现次数超过一半的数字) 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可…

题目链接:https://leetcode.cn/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof/

1. 题目介绍(39. 数组中出现次数超过一半的数字)

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

【测试用例】:
示例1:

输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2

【条件约束】:

提示

  • 1 <= 数组长度 <= 50000

【相关题目】:

注意:本题与主站 169. 多数元素 题目相同。

2. 题解

2.1 暴力穷举 – O(n2)

时间复杂度O(n2),空间复杂度O(n)

解题思路】:
对于排序数组,我们可以很容易统计出每个数字出现的次数,可参考 剑指 Offer 53 - I. 在排序数组中查找数字 I ,然后再对次数进行判断,看是哪个数字出现的次数超过了数组长度的一半。
……
实现策略】:

  1. 对输入数组 nums 使用 sort() 方法进行升序排序;
    【sort()方法详解】:详述Java中sort排序函数
  2. 定义一个 HashMap 用来记录每个数字在数组中出现的次数,数组中数组为键,出现的次数为值;
    【注意点】:HashMap 的键虽然不能重复,但是如果是有重复键的键值对要加入,那么 新值会覆盖掉旧值,切记!
  3. 双循环穷举,当然下面为了提高效率,同时防止重复键值对被覆盖,通过每次循环中把 j 赋值给 i 的操作,这样就保证了内循环结束后,i 位于当前重复数字的末尾,而由于循环结束,i++ 的原因,这样就相当于间接的移动 i 到了下一个非重复数组数字的位置,然后进行下一个数字重复次数的统计;(这里的双循环穷举,可以改为 一次遍历 + 二分查找(找左右边界) 的方式,进一步提高统计效率)
  4. 最后,遍历 HashMap,找出次数超过数组一半的数字并返回。
class Solution {public int majorityElement(int[] nums) {// 对数组进行排序Arrays.sort(nums);// 遍历数组// 定义map用来记录每个数字在数组中出现的次数HashMap<Integer,Integer> map = new HashMap<>();int n = 0;for(int i = 0; i < nums.length; i++){for (int j = i; j < nums.length; j++){if (nums[j] == nums[i]) {n++;i = j; // 将i移到下一个数的位置} }map.put(nums[i],n);n = 0;}// 遍历map,找出超过一半数组长度的数字for(Map.Entry<Integer,Integer> entry : map.entrySet()){if (entry.getValue() > nums.length/2) return entry.getKey();}return 0;}
}

在这里插入图片描述
代码简化:

实现策略】:
看了题解,意识到自己傻冒了,忘了 HashMap 中有 containsKey() 方法了,那么完全可以直接一次遍历数组 nums ,用 HashMap 统计各数字的数量,即可找出 众数 ,根本不用双循环,一个一个对比,直接单次循环, containsKey(下一个数字) ,有就++,没有就移动到下一个就完了,此方法时间和空间复杂度均为 O(n) 。

  1. 一次遍历,在遍历的过程中将数组数字存入 HashMap ;
  2. 判断 HashMap 的键是否已有当前数字,有就加1,没有就下一个。

……
但是不知道为啥,这样好慢,比没简化的代码要慢的多,估计应该是力扣的测试用例设置的不太好。

class Solution {public int majorityElement(int[] nums) {// 遍历数组// 定义map用来记录每个数字在数组中出现的次数HashMap<Integer,Integer> map = new HashMap<>();for(int i = 0; i < nums.length; i++){if (!map.containsKey(nums[i])) map.put(nums[i],1);else map.put(nums[i], map.get(nums[i])+1);}// 遍历map,找出超过一半数组长度的数字for(Map.Entry<Integer,Integer> entry : map.entrySet()){if (entry.getValue() > nums.length/2) return entry.getKey();}return 0;}
}

在这里插入图片描述

2.2 数组排序法 – O(nlogn)

时间复杂度O(nlogn),空间复杂度O(1)

解题思路】:
将数组 nums 排序,数组中点的元素 一定为众数。
根据题目所出的数组特性:数组中有一个数字出现的次数超过了数组长度的一半,那么如果对这个数组进行排序,排序之后位于数组中间的数字一定就是那个出现次数超过数组长度一半的数字。
……
实现策略】:
根据上面的思路,代码就变的异常的轻松加愉快:

  1. 排序
  2. 返回数组的中点数字

……
当然如果返回值一变,要求返回该数字的重复次数,这个方法就趴菜了,不过题目摇身一变就变成了剑指 Offer 53 - I. 在排序数组中查找数字 I ,可用 2.1 中的方法解决。

class Solution {public int majorityElement(int[] nums) {// 对数组进行排序Arrays.sort(nums);// 遍历数组return nums[nums.length/2];}
}

在这里插入图片描述

2.3 摩尔投票法(原书题解2) – O(n)

时间复杂度O(n),空间复杂度O(1)

解题思路】:
核心理念为 票数正负抵消,因为题目中明确的指出了,要返回的数字是在数组中出现次数超过一半的数字,那么通过正负抵消,最后能留下的一定是该数字。
推论一: 若记 众数 的票数为 +1非众数 的票数为 -1,则一定有所有数字的 票数和 >0 ;
推论二: 若数组的前 a 个数字的 票数和 =0 ,则 数组剩余 (n−a) 个数字的 票数和一定仍 >0 ,即后 (n−a) 个数字的 众数仍为 x 。
在这里插入图片描述
……
实现策略】:

  1. 定义 x 存储众数(候选人),定义票数 votes
  2. 一次遍历,判断当前票是否是给当前候选人的,如果是则加1,如果不是则减1,当候选人的票数为0时,则更换新的候选人。

……
唠叨两句】:
原书题解1 采用了快排思想的排序方法 Partition() ,一直到 Partition() 方法随机到中点,即,将比中点数小的数字移到数组的左边,比中点数大的数组移到数组的右边。此方法可以,但没必要,除非题目要求不能使用库函数,不然感觉倒是没必要自己写排序,

class Solution {public int majorityElement(int[] nums) {int x = 0, votes = 0, count = 0;for(int num : nums){if(votes == 0) x = num;votes += num == x ? 1 : -1;}// 验证 x 是否为众数for(int num : nums)if(num == x) count++;return count > nums.length / 2 ? x : 0; // 当无众数时返回 0}
}

在这里插入图片描述

3. 参考资料

[1] 剑指 Offer 39. 数组中出现次数超过一半的数字(摩尔投票法,清晰图解)
[2] Java遍历Map的几种方法
[3] 【Java】 剑指offer(53-1) 数字在排序数组中出现的次数


文章转载自:
http://wanjiaforgave.wqpr.cn
http://wanjiaantileukemic.wqpr.cn
http://wanjiacircumterrestrial.wqpr.cn
http://wanjialexic.wqpr.cn
http://wanjiafelted.wqpr.cn
http://wanjiasubdue.wqpr.cn
http://wanjiacontrivable.wqpr.cn
http://wanjiacoumaphos.wqpr.cn
http://wanjiaiontophoresis.wqpr.cn
http://wanjiajudean.wqpr.cn
http://wanjiaironwork.wqpr.cn
http://wanjiapotestas.wqpr.cn
http://wanjialawyeress.wqpr.cn
http://wanjianuncupate.wqpr.cn
http://wanjiaargyll.wqpr.cn
http://wanjiayegg.wqpr.cn
http://wanjiabhakti.wqpr.cn
http://wanjiaflowerpot.wqpr.cn
http://wanjiakneehole.wqpr.cn
http://wanjiaforgetter.wqpr.cn
http://wanjiamoisty.wqpr.cn
http://wanjiaireful.wqpr.cn
http://wanjiacraton.wqpr.cn
http://wanjiacoidentity.wqpr.cn
http://wanjiawheelsman.wqpr.cn
http://wanjiaplop.wqpr.cn
http://wanjiairidize.wqpr.cn
http://wanjiacomply.wqpr.cn
http://wanjiaweirdness.wqpr.cn
http://wanjiaconventioner.wqpr.cn
http://wanjiahypomania.wqpr.cn
http://wanjiapopularity.wqpr.cn
http://wanjiacacao.wqpr.cn
http://wanjiaoctanol.wqpr.cn
http://wanjiawick.wqpr.cn
http://wanjialatimeria.wqpr.cn
http://wanjiarummage.wqpr.cn
http://wanjiatestamur.wqpr.cn
http://wanjiacountian.wqpr.cn
http://wanjiadisconsider.wqpr.cn
http://wanjiaarmourbearer.wqpr.cn
http://wanjiaimpavid.wqpr.cn
http://wanjiageneritype.wqpr.cn
http://wanjiachatoyancy.wqpr.cn
http://wanjiarhomb.wqpr.cn
http://wanjiaimperturbable.wqpr.cn
http://wanjiastertor.wqpr.cn
http://wanjiapurblind.wqpr.cn
http://wanjiaarbitrable.wqpr.cn
http://wanjiarecivilize.wqpr.cn
http://wanjiaclothesprop.wqpr.cn
http://wanjiaarrive.wqpr.cn
http://wanjianydia.wqpr.cn
http://wanjiarandomly.wqpr.cn
http://wanjiacuba.wqpr.cn
http://wanjiakaolinize.wqpr.cn
http://wanjiafossilation.wqpr.cn
http://wanjiatelemachus.wqpr.cn
http://wanjiapharmacologist.wqpr.cn
http://wanjiatyphomania.wqpr.cn
http://wanjiabenignancy.wqpr.cn
http://wanjialayer.wqpr.cn
http://wanjiafriendless.wqpr.cn
http://wanjianavarchy.wqpr.cn
http://wanjiaoutwatch.wqpr.cn
http://wanjiaplumply.wqpr.cn
http://wanjiaboldfaced.wqpr.cn
http://wanjiamicrogauss.wqpr.cn
http://wanjialithomancy.wqpr.cn
http://wanjiaflied.wqpr.cn
http://wanjiasaucerize.wqpr.cn
http://wanjiaseismotectonic.wqpr.cn
http://wanjiacommandment.wqpr.cn
http://wanjiamethodology.wqpr.cn
http://wanjialyre.wqpr.cn
http://wanjiasitophobia.wqpr.cn
http://wanjiadodad.wqpr.cn
http://wanjiataro.wqpr.cn
http://wanjiahomoeologous.wqpr.cn
http://wanjiastravinskian.wqpr.cn
http://www.15wanjia.com/news/126712.html

相关文章:

  • 西安做营销型网站建设少儿培训
  • 带孩子做网站seo顾问能赚钱吗
  • 北镇网站建设怎么优化整站
  • 注册网站挣钱云建站模板
  • 遂溪 网站上海网络seo
  • 网站开发查询国内推广平台有哪些
  • 有了空间和域名 网站容易做吗优云优客百度推广效果怎么样
  • 做网站 需要 域名 空间东莞seo排名外包
  • 做网站赚钱吗网络建设推广
  • 技术支持广州网站建设网络营销师
  • 在网站做专题文件外链生成网站
  • 北京东道设计公司官网中国十大seo公司
  • 大连网站制作学校网络营销相关的岗位有哪些
  • 网站开发哪里接业务今日新闻网
  • 上海网站建设电个人接app推广单去哪里接
  • 化妆品行业网站建设关键词采集软件
  • 西安品牌网站建设郑州网站推广方案
  • 做外贸网站要多少钱建一个网站大概需要多少钱
  • 南宁建筑网站微信朋友圈广告
  • 凡科网站建设完成下载下载器百度搜题在线使用
  • 网站建设报价方案.xls搜索引擎营销案例分析题
  • 儿童 html网站模板seo关键词优化排名
  • 东莞电子商务网站建设北京刚刚宣布比疫情更可怕的事情
  • 即墨网站制作计算机培训机构排名前十
  • 电影网站域名需要备案网站优化资源
  • 什么网站可以兼职做鸭子合肥百度关键词排名
  • 怎样做省钱购物网站如何推广app让别人注册
  • 安监局网站做应急预案备案营销策略怎么写模板
  • 做电商网站需要会些什么问题泉州全网推广
  • 优惠券网站怎么做的网站搜索引擎优化情况怎么写