【剑指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.如果 ...
随机推荐
- 预测汽车级Linux专业技术的需求
预测汽车级Linux专业技术的需求 Anticipating need for Automotive Grade Linux expertise 在听了多年汽车级Linux(AGL)及其所有潜力之后, ...
- 升级 macOS Big Sur 差点丢了我多年的珍藏文件(夹)!!!
原来升级 macOS Big Sur 过程中会转移根目录下的个人文件(夹). 春节期间升级了一下 macOS ,升级之前就比较担心丢数据,然而怕什么来什么.升级之后发现根目录下的个人文件(夹)都不见了 ...
- python 日期与字符串之间的转换
1.str转换为datetime >>> from datetime import datetime >>> cday = datetime.strptime('2 ...
- ffmpeg实战-音视频合成案例
转发自白狼栈:查看原文 很多小伙伴私下里留言说,之前没接触过音视频,对于ffmpeg可以做什么还是有些懵. 今天我们一起看下我们究竟可以用 ffmpeg 做什么? 很多小伙伴应该都玩过抖音,你在&qu ...
- Flink从Kafka取数WordCount后TableApi写入ES
一.背景说明 需求为从Kafka消费对应主题数据,通过TableApi对数据进行WordCount后,基于DDL写法将数据写入ES. 二.代码部分 说明:代码中关于Kafka及ES的连接部分可以抽象到 ...
- JVM面试题(史上最强、持续更新、吐血推荐)
文章很长而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三部 ...
- Spring Reactor 入门与实践
适合阅读的人群:本文适合对 Spring.Netty 等框架,以及 Java 8 的 Lambda.Stream 等特性有基本认识,希望了解 Spring 5 的反应式编程特性的技术人员阅读. 一.前 ...
- 题解 P3233 [HNOI2014]世界树
题目传送门 解题思路 正解当然是虚树了. 首先对于原树以及虚树各开一个结构体存边,这个不用多说. 然后我们先 DFS 一遍,求出各个节点的时间戳,子树大小,深度以及父亲节点,并初始化倍增 LCA . ...
- 机器人路径规划其一 Dijkstra Algorithm【附动态图源码】
首先要说明的是,机器人路径规划与轨迹规划属于两个不同的概念,一般而言,轨迹规划针对的对象为机器人末端坐标系或者某个关节的位置速度加速度在时域的规划,常用的方法为多项式样条插值,梯形轨迹等等,而路径规划 ...
- JMeter定时器种类+详细教程举例
首先,我们先了解一下定时器的常见种类以及它的作用. 原文地址:https://www.cnblogs.com/istart/p/11184533.html 一.定时器种类+作用 上面是我截图的自己有道 ...