Skip to content

Commit f2ddb27

Browse files
committed
Jz28__数组中出现次数超过一半的数字
1 parent 7fd385a commit f2ddb27

2 files changed

Lines changed: 103 additions & 1 deletion

File tree

Offer/src/com/cpucode/java/getting/started/Jz28.java

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package com.cpucode.java.getting.started;
22

3+
import java.util.HashMap;
4+
import java.util.Map;
5+
import java.util.Arrays;
6+
37
/**
48
* 题目描述
59
* 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。
@@ -17,4 +21,102 @@
1721
* @CSDN : https://blog.csdn.net/qq_44226094
1822
*/
1923
public class Jz28 {
24+
public int MoreThanHalfNum_Solution(int [] array) {
25+
Map<Integer, Integer> map = new HashMap<>(array.length + 1);
26+
27+
for(int i = 0; i < array.length; i++){
28+
/**
29+
* 查询是否有这个key
30+
* */
31+
if(map.containsKey(array[i])){
32+
/**
33+
* 有出现就加一
34+
* */
35+
map.put(array[i], map.get(array[i]) + 1);
36+
} else{
37+
/**
38+
* 第一次出现这个key
39+
* */
40+
map.put(array[i], 1);
41+
}
42+
43+
/**
44+
* 查询是否大于数组一半
45+
* */
46+
if(map.get(array[i]) > (array.length/2)){
47+
return array[i];
48+
}
49+
}
50+
51+
return 0;
52+
}
53+
54+
public int MoreThanHalfNum_Solution1(int [] array) {
55+
/**
56+
* 排序
57+
* */
58+
Arrays.sort(array);
59+
60+
int count = 0;
61+
/**
62+
* 中间下标, 如果众数大于一半, 就绝对在中间
63+
* */
64+
int half = array.length/2;
65+
66+
for(int num : array){
67+
if(num == array[half]){
68+
/**
69+
* 记录中间值的数量
70+
* */
71+
count++;
72+
}
73+
}
74+
75+
if(count > half){
76+
return array[half];
77+
}else{
78+
return 0;
79+
}
80+
}
81+
82+
public int MoreThanHalfNum_Solution2(int [] array) {
83+
int cond = -1;
84+
int cnt = 0;
85+
86+
for(int num : array){
87+
88+
if(cnt == 0){
89+
/**
90+
* 找到新的众数
91+
* */
92+
cond = num;
93+
cnt++;
94+
}else{
95+
if(cond == num){
96+
/**
97+
* 和众数一样
98+
* */
99+
cnt++;
100+
}else{
101+
/**
102+
* 和众数不一样
103+
* */
104+
cnt--;
105+
}
106+
}
107+
}
108+
109+
cnt = 0;
110+
111+
for(int num : array){
112+
if(num == cond){
113+
cnt++;
114+
}
115+
if(cnt > array.length/2){
116+
return cond;
117+
}
118+
}
119+
120+
return 0;
121+
}
20122
}

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -815,7 +815,7 @@ java编程基础 面向对象 javaAPI 集合 IO GUI JD8C 多线程 网络编程
815815
- [x] [Jz9__变态跳台阶](Offer/src/com/cpucode/java/getting/started/Jz9.java)
816816
- [x] [Jz16__合并两个排序的链表](Offer/src/com/cpucode/java/getting/started/Jz16.java)
817817
- [x] [Jz18__二叉树的镜像](Offer/src/com/cpucode/java/getting/started/Jz18.java)
818-
- [ ] [Jz28__数组中出现次数超过一半的数字](Offer/src/com/cpucode/java/getting/started/Jz28.java)
818+
- [x] [Jz28__数组中出现次数超过一半的数字](Offer/src/com/cpucode/java/getting/started/Jz28.java)
819819

820820

821821
- [返回目录](#文件目录)

0 commit comments

Comments
 (0)