剑指Offer:找出数组中出现次数超过一半的元素
题目:找出数组中出现次数超过一半的元素
解法:每次删除数组中两个不同的元素,删除后,要查找的那个元素的个数仍然超过删除后的元素总数的一半
#include <stdio.h> int half_number(int a[], int n)
{
if( a == NULL || n <= )
return -; int i, candidate;
int times = ;
for( i=; i<n; i++ )
{
if( times == )
{
candidate = a[i];
times = ;
}
else if( a[i] == candidate )
++times;
else
--times;
}
return candidate;
} int main(void)
{
int a[] = {,,,,,,,,}; int result = half_number(a, );
if( result != - )
printf("%d\n", result);
else
printf("Error.\n"); return ;
}
该题的扩展:数组中有3个元素出现的次数都超过数组元素总数N的1/4, 找出这三个元素
解法:同上,但是每次删除4个互不相同的元素,处理上比上面的稍微麻烦
#include <stdio.h> void find(int a[], int n)
{
if( a==NULL || n<= )
{
printf("Error.\n");
return ;
} int i,j;
int times[] = {,,}; // 3个candidate的计数
int candidate[] = {-,-,-}; // 假设元素不可能是-1 for( i=; i<n; i++ )
{
if( times[] == && a[i] != candidate[] && a[i] != candidate[] ) // 第1个candidate目前空缺, 且当前元素a[i]不等于其他两个candidate时, 将该元素作为新的candidate
{
candidate[] = a[i];
times[] = ;
}
if( times[] == && a[i] != candidate[] && a[i] != candidate[] )
{
candidate[] = a[i];
times[] = ;
}
if( times[] == && a[i] != candidate[] && a[i] != candidate[] )
{
candidate[] = a[i];
times[] = ;
}
else if( a[i] == candidate[] )
{
++times[];
}
else if( a[i] == candidate[] )
{
++times[];
}
else if( a[i] == candidate[] )
{
++times[];
}
else // 删除4个各不相同的数组元素, 删除后
{
--times[];
--times[];
--times[];
}
}
printf("%d %d %d\n",candidate[],candidate[],candidate[]);
} int main(void)
{
int a[] = {,,,,,,,,,,,,,,,,,,,,,,};
find(a, );
return ;
}
剑指Offer:找出数组中出现次数超过一半的元素的更多相关文章
- 剑指offer.找出数组中重复的数字
题目: 给定一个长度为 n 的整数数组 nums,数组中所有的数字都在 0∼n−1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复的数 ...
- 【剑指offer】73.数组中出现次数超过一半的数字
73.数组中出现次数超过一半的数字 知识点:数组:哈希:占领地思想: 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4 ...
- 找出数组中出现次数超过一半的数,现在有一个数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数
找出数组中出现次数超过一半的数,现在有一个数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数 #include<iostream>using namespace s ...
- 剑指Offer 找出字符串中第一个只出现一次的字符
题目描述 找出字符串中第一个只出现一次的字符 如果无此字符 请输出'.' 输入描述: 输入一串字符,由小写字母组成 输出描述: 输出一个字符 输入例子: asdfasdfo 输出例子: o 思路:数组 ...
- 剑指offer系列54---数组中出现次数超过一半的数
[题目]数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. * 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}. * 由于数字2在数组中出现了5次,超过数组长度的一半,因 ...
- Java实现找出数组中重复次数最多的元素以及个数
/**数组中元素重复最多的数 * @param array * @author shaobn * @param array */ public static void getMethod_4(int[ ...
- 剑指 Offer 56 - II. 数组中数字出现的次数 II + 位运算
剑指 Offer 56 - II. 数组中数字出现的次数 II Offer_56_2 题目详情 解题思路 java代码 package com.walegarrett.offer; /** * @Au ...
- 《剑指offer》旋转数组中的最小数字
本题来自<剑指offer> 旋转数组中的最小数字 题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例 ...
- 【剑指Offer】旋转数组中的最小数字 解题报告(Python)
[剑指Offer]旋转数组中的最小数字 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-intervie ...
随机推荐
- MFC VC6++学习笔记
一.mfc中基于对话框程序添加菜单栏 1打开对话框资源,然后右键->属性->常规 里面有个"菜单" 下拉框,然后选择IDM_USER! 2打开对话框,右键属性,选择刚才 ...
- Android UI效果实现——滑动模糊渐变效果实现
前言: 大家应该都看到过iOS7解锁屏幕的滑动模糊渐变效果,好了,现在可以把手纸收起来了,今天黄老师就给大家讲一下如何在Android平台上 实现类似的滑动模糊渐变效果,其实方式远比你想像的简单. 目 ...
- JSP 隐藏对象
[摘要] 隐藏对象用在jsp表达式和脚本中,不能直接用在jsp声明中,因为这些隐藏对象是容器在jspservice方法中定义的,在这个方法中定义的变量不能在jsp声明中使用.可以通过参数方法将 ...
- Android判断用户是平板还是手机的方法
public boolean isTabletDevice() { TelephonyManager telephony = (TelephonyManager) mContext.ge ...
- 关于MySQL Connector/C++那点事儿
如果从官方直接下载的库使用时遇到类似如下的问题: 原因是官方提供的库文件版本与需要的库版本不匹配,提供的debug版本使用的是MT版本,在debug模式下会出现内存错误,导致crash. TestC. ...
- 2016 系统设计第一期 (档案一)MVC 和 Bootstrap 表单转换
bootstrap <form role="form"> <div class="form-group"> <label for= ...
- 语音合成,语音播报功能(系统)-b
第一次接触语音合成,只实现了很简单的功能,记录一下,以后免得去网上四处找资料 最近在做高德地图导航的时候有个语音播报的功能,高德sdk已经提供了要语音的字符串.我要做的就是把这些字符串读出声音来即可. ...
- 贪心算法——将正整数变为1
题目链接http://toutiao.com/a6320936270101528833/ 为避免链接失效,再粘贴一下题目内容: 给你一个数n,有3种操作: 1.这个数加1 2.这个数减1 3.如果这个 ...
- Oracle sql查询
http://blog.csdn.net/jlds123/article/details/6572559
- HDU4548+素数
简单题. /* */ #include<stdio.h> #include<string.h> #include<stdlib.h> #include<alg ...