【剑指offer】73.数组中出现次数超过一半的数字
73.数组中出现次数超过一半的数字
知识点:数组;哈希;占领地思想;
题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
解法一:
最容易想到的,直接遍历数组,对于每一个元素,将其他的遍历一遍,看有没有和它一样的,相当于遍历两次数组,大于一半直接返回;
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
for(int i = 0; i < array.length; i++){
int count = 0;
for(int j = 0; j < array.length; j++){
if(array[j] == array[i]){
count++;
}
}
if(count > array.length / 2){
return array[i];
}
}
return 0;
}
}
时间复杂度O(n^2);
解法二:
这种找重复数字的,其实往往都会用到Hash的知识,由于我们又得需要一个值去对应存每个值有几个,所以采用map的<key,value>这种对应键值来保存;
import java.util.*; //注意要熟悉HashMap的常用方法;
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int k : array){
if(!map.keySet().contains(k)){
map.put(k,1);
}else{
map.put(k,map.get(k)+1);
}
}
for(int k : map.keySet()){
if(map.get(k) > array.length / 2){
return k;
}
}
return 0;
}
}
这样只遍历一遍数组就可以,时间复杂度O(n);
解法三:
抢阵地思想:试想现在我们有一个土坡需要占领,然后有好几个队都要占领这个土坡,而且每一个队能够消灭其他对一个人,也就是极限一换一;如果有一个队有超过总人数一半的人数,那是不是肯定最好他们能占领土坡(即使你们不内讧全部来跟我换我也能赢,就是人多就是玩),现在我们就可以用这个思想去解,依次往土坡上冲,谁活到最好谁就赢。
注意:有超过一半的一定能留在最后,但是留在最后的不一定超过一半,一个队就1个,你们全都1V1换完了,那最后我上,那就是我了,所以最后还要判断一下;
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
int num = array[0]; //先让第一个人冲上去占领土坡;
int count = 1; //记录每次土坡上的人数;
for(int i = 1; i < array.length; i++){
if(count == 0){
num = array[i];
count++;
}else if(array[i] == num){
count++;
}else{
count--;
}
}
if(count > 0){
int times = 0;
for(int i = 0; i < array.length; i++){
if(array[i] == num){
times++;
}
}
if(times > array.length / 2){
return num;
}
return 0;
}
return 0;
}
}
时间复杂度:O(n);
【剑指offer】73.数组中出现次数超过一半的数字的更多相关文章
- 剑指Offer:数组中出现次数超过一半的数字【39】
剑指Offer:数组中出现次数超过一半的数字[39] 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如,输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于这 ...
- 剑指 Offer 39. 数组中出现次数超过一半的数字 + 摩尔投票法
剑指 Offer 39. 数组中出现次数超过一半的数字 Offer_39 题目描述 方法一:使用map存储数字出现的次数 public class Offer_39 { public int majo ...
- 剑指 Offer 39. 数组中出现次数超过一半的数字
剑指 Offer 39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输入: [ ...
- 力扣 - 剑指 Offer 39. 数组中出现次数超过一半的数字
题目 剑指 Offer 39. 数组中出现次数超过一半的数字 思路1(排序) 因为题目说一定会存在超过数组长度一半的一个数字,所以我们将数组排序后,位于length/2位置的一定是众数 代码 clas ...
- 【剑指Offer】数组中出现次数超过一半的数字 解题报告(Python)
[剑指Offer]数组中出现次数超过一半的数字 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-inter ...
- 【Java】 剑指offer(39) 数组中出现次数超过一半的数字
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如 ...
- Go语言实现:【剑指offer】数组中出现次数超过一半的数字
该题目来源于牛客网<剑指offer>专题. 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组 ...
- 剑指OFFER之数组中出现次数超过一半的数字(九度OJ1370)
题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2 ...
- 剑指Offer 28. 数组中出现次数超过一半的数字 (数组)
题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...
- 《剑指offer》-数组中出现次数超过一半的数字
/* 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如果 ...
随机推荐
- AIFramework框架Jittor特性(下)
AIFramework框架Jittor特性(下)
- OSPF-三张表+路由器角色+router-id
验证理论: 1.剖析OSPF的三张表:邻居表,拓扑表,路由表 dis ospf peer brief dis ospf lsdb dis ip routing-table protocol ospf ...
- java后端知识点梳理——多线程与高并发
进程与线程 进程是一个"执行中的程序",是系统进行资源分配和调度的一个独立单位 线程是进程的一个实体,一个进程中一般拥有多个线程. 线程和进程的区别 进程是操作系统分配资源的最小单 ...
- P2782 友好城市(最长不下降子序列)
题目描述 有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的$N$个城市.北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同.每对友好城市都向政府申请在河上开辟一条直 ...
- 即时性能分析工具 Pyroscope
当网站上线后,流量增加或短暂功能故障,都会造成使用者体验相当不好,而这时该怎么快速找到性能的瓶颈呢?通常 CPU 达到 100% 时,有时候也很难复制及找出关键问题点. 本篇文章,我们会介绍一套工具叫 ...
- EasyExcel随笔
EasyExcel 注意点 不支持的功能 单个文件的并发写入.读取 读取图片 宏 csv读取 出现 NoSuchMethodException, ClassNotFoundException, NoC ...
- cmake使用笔记,一些常用的命令
我的工程目录如下: │ CMakeLists.txt ├─cmake_tutorial │ CMakeLists.txt │ cmake_tutorial.cpp │ cmake_tutorial.h ...
- 《电容应用分析精粹:从充放电到高速PCB设计》最新勘误表
最新勘误表百度云盘下载 链接: https://pan.baidu.com/s/18yqwnJrCu9oWvFcPiwRWvA 提取码: x3e3 (本勘误表仅包含错误相关部分,不包含对语句的 ...
- 喜鹊开发者(The Magpie Developer)
搬运文,原文地址:https://div.io/topic/1576 我经常感觉,开发人员很像我们所说的喜鹊,以不停的获取很多小玩意来装饰他们的窝而著称.就像喜鹊一样,开发人员通常都被定义为聪明的.好 ...
- C#WebApi的创建与发布
VS中新建项目-Web-ASP.NET Web应用程序 然后确定,选择空模版就可以了,勾上Webapi(也可以选择webapi模板,这样生成的文件比较多) 添加好之后Controllers和Model ...