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

提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163?tpId=13&tqId=11181                                                

参与人数:3512  时间限制:1秒  空间限制:32768K

本题知识点:数组

题目描述

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

分析:

当测试用例出现不到一半的情况,应该输出0。

方法1:快排,如果出现次数超过一半数目的数存在,则该值一定与中位数相等,将其返回;否则返回0. 快排复杂度为n*log n.

另外此题据说有O(n)复杂度的算法...

AC代码:

#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
class Gift {
public:
int getValue(vector<int> gifts, int n) {
if(gifts.size()==0 || n<=0) return 0;
// if(gifts.size()!=n) return 0; // 此语句有无,在牛客网oj上均能通过,按道理应加上的...
sort(gifts.begin(),gifts.end());
int countMid=0, res;
for(int i=0; i<gifts.size();i++)
{
if(gifts[i] >= gifts[n/2]) countMid++;
}
if(countMid>n/2) res=gifts[n/2];
else res=0;
return res;
}
};
// 以下为测试
int main()
{
Gift sol;
int n1=5;
vector<int> gifts1={1,2,3,2,2}; int res1=sol.getValue(gifts1, n1);
printf("%d\n",res1); return 0;
}

腾讯 2015秋招 编程题4:微信红包中个数超过总数一半的红包金额

题目描述
春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。

给定一个红包的金额数组gifts及它的大小n,请返回所求红包的金额。

测试样例:
[1,2,3,2,2],5


返回:2


AC代码:

#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
class Gift {
public:
int getValue(vector<int> gifts, int n) {
if(gifts.size()==0 || n<=0) return 0;
// if(gifts.size()!=n) return 0; // 此语句有无,在牛客网oj上均能通过,按道理应加上的...
sort(gifts.begin(),gifts.end());
int countMid=0, res;
for(int i=0; i<gifts.size();i++)
{
if(gifts[i] >= gifts[n/2]) countMid++;
}
if(countMid>n/2) res=gifts[n/2];
else res=0;
return res;
}
};
// 以下为测试
int main()
{
Gift sol;
int n1=5;
vector<int> gifts1={1,2,3,2,2}; int res1=sol.getValue(gifts1, n1);
printf("%d\n",res1); return 0;
}

这道题最优的解法类似于 《编程之美》中"寻找水王"的问题,时间复杂度为O(n),空间复杂度O(1)。


169. Majority Element(求众数)

提交网址: https://leetcode.com/problems/majority-element/

Total Accepted: 113359 Total Submissions: 273577 Difficulty: Easy

Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.

You may assume that the array is non-empty and the majority element always exist in the array.

Credits:
Special thanks to @ts for adding this problem and creating all test cases.

AC代码:

class Solution {
public:
int majorityElement(vector<int>& numbers) {
int len=numbers.size();
if(len==0) return 0;
sort(numbers.begin(),numbers.end());
int countMid=0, res;
for(int i=0; i<numbers.size();i++)
{
if(numbers[i] == numbers[len/2]) countMid++;
}
if(countMid>len/2) res=numbers[len/2];
else res=0;
return res;
}
};

Leetcode - 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)的更多相关文章

  1. 剑指Offer:面试题29——数组中出现次数超过一半的数字(java实现)

    PS:在前几天的面试中,被问到了这个题.然而当时只能用最低效的方法来解. 问题描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2, ...

  2. 剑指Offer - 九度1370 - 数组中出现次数超过一半的数字

    剑指Offer - 九度1370 - 数组中出现次数超过一半的数字2013-11-23 03:55 题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组 ...

  3. 【剑指Offer】28、数组中出现次数超过一半的数字

      题目描述:   数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.   例如:输入如下所示的一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过 ...

  4. 剑指Offer:找出数组中出现次数超过一半的元素

    题目:找出数组中出现次数超过一半的元素 解法:每次删除数组中两个不同的元素,删除后,要查找的那个元素的个数仍然超过删除后的元素总数的一半 #include <stdio.h> int ha ...

  5. 剑指offer(28)数组中出现次数超过一半的数

    题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  6. 【Offer】[39] 【数组中出现次数超过一半的数字】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如,输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数 ...

  7. 《剑指offer》面试题39. 数组中出现次数超过一半的数字

    问题描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, ...

  8. 剑指offer 面试题56. 数组中只出现一次的两个数字

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 方法1:用set记录出现过的数字 class Solution { public: void F ...

  9. 【剑指offer】找出数组中任意一个重复的数字,C++实现

    原创博文,转载请注明出处! # 题目 # 思路 对于长度为n的数组,范围为0~n-1的数字而言,如果不粗在重复数字,则排序后数组元素和数组角标相同.如果存在重复数字,则在排序的过程中会出现不同下标对应 ...

随机推荐

  1. AAC编码学习

    AAC音频编码 https://www.jianshu.com/p/af0165f923e9 https://blog.csdn.net/u013427969/article/details/5309 ...

  2. 我的第一个.NET Core App Windows系统

    一.前言 本篇开发环境?1.操作系统: Windows 10 X642.SDK: .NET Core 2.0 Preview 二.安装 .NET Core SDK 1.下载 .NET Core下载地址 ...

  3. json格式new Date()的一个小坑

    见图:JSON.stringify( new Date(Date.parse('xxxx-xx-xx'))) 若是传的日期,在10号前,要进行转换.

  4. 一小时学会ECMAScript6新特性(二)

    1.对象属性名 es5中我们为一个对象添加属性可以用如下代码: let foods = {}; foods.dessert = '蛋糕'; console.log(foods) 但是属性名中间有空格则 ...

  5. [python]numpy.mean()用法

    a=np.array([[[1,1],[2,2],[3,3]],[[4,4],[5,5],[6,6]],[[7,7],[8,8],[9,9]],[[10,10],[11,11],[12,12]]]) ...

  6. python爬取房天下数据Demo

    import requests from bs4 import BeautifulSoup res = requests.get('http://sh.esf.fang.com/chushou/3_3 ...

  7. 几个VB常见又内涵的错误

    第一位内涵的就是:没有对象 找到对象,却发现是别人的对象 不能加载也不能卸载...这到底是什么对象 哈哈哈~

  8. MyBatis(五)select返回list数据

    (1)接口中编写方法 public List<Emp> getEmps(String lastName); (2)编写Mapper文件 <select id="getEmp ...

  9. 网防G01管理检测系统Linux版安装

    监测包内容: gov_defence_agent_x64_linux_v3.1.18.tar.gz LinuxVersion(datalog.sh  getlog.sh  setup.sh) 1.  ...

  10. HTML入门10

    目前,掌握了图像,视频和音频的嵌入,下面来谈iframe和embed.object嵌入网页, 嵌入简史,刚开始流行用嵌入框架然后不同部分显示i不同内容,可以解决下载速度慢时的问题: 慢慢的插件技术流行 ...