首页 > 其他分享 >剑指offer:数组中出现次数超过一半的数字

剑指offer:数组中出现次数超过一半的数字

时间:2022-12-01 19:02:15浏览次数:51  
标签:index cnt offer int len 次数 num numbers 数组


题目描述

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

方法1

利用快排的partion

class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {

int len = numbers.size();

if (len == 0){
return 0;
}

int index = partition(numbers, 0, len - 1);

int mid = (len - 1) >> 1;

int left = 0, right = len - 1;

while (index != mid){
if (index < mid){
left = index + 1;
index = partition(numbers, left, right);
}
else{
right = index - 1;
index = partition(numbers, left, right);
}
}

int cnt = 0;
for (int num : numbers){
if (num == numbers[mid]){
cnt++;
}
}

//不能用mid+1来判断,因为2*(mid+1)不一定等于len
return cnt*2 > len ? numbers[mid] : 0;
}

private:
int partition(vector<int> &numbers, int left, int right){

int i = left, j = right;
int pivot = numbers[i];

while (i < j){
while (i < j && numbers[j] > pivot) j--;
if (i < j){
numbers[i++] = numbers[j];
}

while (i < j && numbers[i] <= pivot) i++;
if (i < j){
numbers[j--] = numbers[i];
}

}
numbers[i] = pivot;

return i;
}

};

方法二

class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {

int len = numbers.size();

if (len == 0){
return 0;
}

int num = numbers[0];
int cnt = 1;

for (int i = 1; i < len; i++){

if (cnt == 0){
num = numbers[i];
cnt = 1;
continue;
}

if (numbers[i] == num){
cnt++;
}
else{
cnt--;
}
}

int times = 0;
for (int n : numbers){
if (n == num){
times++;
}
}

return 2 * times > len ? num : 0;

}
};


标签:index,cnt,offer,int,len,次数,num,numbers,数组
From: https://blog.51cto.com/u_15899184/5903621

相关文章

  • 剑指offer:复杂链表的复制
    题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。/*structRandomListNode{intlabel;structRandom......
  • 剑指offer:数组中的逆序对
    题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。classSolution{public:intInv......
  • 剑指offer:最小的K个数
    题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。方法一O(n)改变输入,适合小数据classSolution{public:vector<i......
  • 剑指offer:翻转单词顺序列
    题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“s......
  • List集合转换成数组
    我现在有个需求:将File集合转换成MultipartFile数组结构然后我就开始在网上开启了List转换到数组之旅。首先来看一个例子ArrayList<String>list=newArrayList<......
  • vue2 数组18 some erver filter reduce axios
    some: return true是固定写法,终止some循环 erver: filter:   优化写法:arr.filter(item=>item.state).reduce((累加的结果,当前循环项)=>{},初始值)拿上......
  • Django 操作数据库 出现 too many connections错误 连接次数过多
    通过CONN_MAX_AGE优化Django的数据库连接https://www.cnblogs.com/aaron-agu/p/10380559.html ......
  • Go--求数组奇偶数之和
    packagemain//申明main包import"fmt"//导入fmt标准库funcmain(){arr:=[...]int{01,11,22,33,44,55,66,77,88,99,98,87,76,65,54,43,32,......
  • js 将长度不确定的数组分割成n个一组的数组
    代码实现:consttransSliceImg=(imgs,num)=>{letnewImgs=[]returnimgs.reduce(function(pre,item,index,imgs){varbegin=index*num;......
  • 剑指offer题解C++版
    一,常见数据结构1,数组3-找出数组中重复的数字4-二维数组中的查找5-替换空格29-顺时针打印矩阵leetcode989-数组形式的整数加法leetcode26-删除有序数组中的重复......