剑指Offer:数组中出现次数超过一半的数字【39】

题目描述

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

解法一:基于Partition函数时间复杂度为O(n)的算法

简要思路

  数组中有一个数字出现的次数超过了数组长度的一半。如果把这个数组排序,那么排序之后位于数组中间的数字一定就是那个出现次数超过数组长度一半的数字。也就是说,这个数字就是统计学上的中位数。

  在随机快排算法中,我们现在数组中随机选择一个数字,然后调整数组中数字的顺序,使得比选中的数字小的数字都在它的左边,比选中数字大的数字都排在它的右边。如果选中的这个数字的小标刚好是n/2,那么这个数字就是这个数字的中位数;如果它的下标大于n/2,那么中位数应该位于它的左边,我们可以接着在它的左边部分的数组中进行查找。否则,可以在右边中进行查找!

  大概意思是这样的:

Java实现代码

import java.util.Scanner;

public class PartitionDemo {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String str = input.nextLine();
String[] arrStr =str.split(" ");
int[] arrN = new int[arrStr.length];
for(int i=0;i<arrStr.length;i++)
arrN[i]= Integer.parseInt(arrStr[i]);
System.out.println(MoreThanHalfNum(arrN,arrN.length));
}
//数目超过一半的数字
public static int MoreThanHalfNum(int[] numbers,int length)
{
int middle = length>>1;
int start = 0;
int end = length-1;
int index = partition(numbers,start,end);
while (index!=middle)
{
if(index>middle) {
end = index-1;
index = partition(numbers,start,end);
}
else{
start = index+1;
index=partition(numbers,start,end);
}
}
int result = numbers[middle];
return result;
}
//划分
public static int partition(int[] aux,int lo,int hi)
{
int i=lo,j=hi+1; //左右两个指针,分别从两端开始
int val = aux[lo]; //取最左边的第一个元素为枢纽元素
while (true)
{
while (aux[++i]<val)if(i==hi)break; //左指针向右找到一个大于枢纽的
while (aux[--j]>val)if(j==lo)break; //右指针向左找到一个大于枢纽的 if(i>=j) break; //这个i>=j是很关键的,这表明现在已经划分成功,即两边元素有序!
exch(aux,i,j); //i!=j,表示还有能找的!
}
exch(aux,lo,j); //把枢纽元素交换至它应该的位置!
return j; //把划分点返回区,目的是说,从这里开始,两边分别已成为为左右子序列,返回的是j这是很关键的,因为i可能大于j。
}
//交换
public static void exch(int[] aux,int i,int j)
{
int t=aux[i];
aux[i]=aux[j];
aux[j]=t;
}
}

  

剑指Offer:数组中出现次数超过一半的数字【39】的更多相关文章

  1. python剑指offer数组中出现次数超过一半的数字

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

  2. 剑指Offer——数组中出现次数超过一半的数字——一题多解

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

  3. 剑指offer——数组中出现次数超过一半的数字(c++)

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

  4. 剑指Offer——数组中出现次数超过一半的数字

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

  5. 用js刷剑指offer(数组中出现次数超过一半的数字)

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

  6. 剑指Offer-28.数组中出现次数超过一半的数字(C++/Java)

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

  7. 剑指offer--11.数组中出现次数超过一半的数字

    unique(), count()函数好用 ---------------------------------------------------------------------- 时间限制:1秒 ...

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

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

  9. 剑指offer-数组中出现次数超过一半的数字

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

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

    剑指offer 面试题29:数组中出现次数超过一半的数字 提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 ...

随机推荐

  1. 【hibernate】主键生成策略使用UUID报出如下警告:org.hibernate.id.UUIDHexGenerator - HHH000409: Using org.hibernate.id.UUIDHexGenerator which does not generate IETF RFC 4122 compliant UUID values;

    主键生成策略使用UUID报出如警告如下: 控制台- 2017-11-24 18:40:14 [restartedMain] WARN org.hibernate.id.UUIDHexGenerator ...

  2. Java的日志模块

    目前主流的是是logback和log4j2,它们底层实现用的都是slf4j,通过slf4j-api调用 使用指定类初始化日志对象,在日志输出的时候,可以打印出日志信息所在类如:Logger logge ...

  3. 数据挖掘-MovieLens数据集_电影推荐_亲和性分析_Aprioro算法

    #!/usr/bin/env python2 # -*- coding: utf-8 -*- """ Created on Tue Feb  7 14:38:33 201 ...

  4. 转: 学习Javascript闭包(Closure) (阮一峰)

    from: http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

  5. 改用MyAnalyzer的KMeans聚类算法

    <strong><span style="font-size:18px;">/*** * @author YangXin * @info 改用MyAnaly ...

  6. zepto jquery和zepto的区别?

    jQuery 由于强大的生命力基本上是一个事实标准,所以大部分工具 lib 在 DOM 操作.动画等功能上或多或少都会是 jQuery-like 的. Zepto 的 API 就是完全兼容 jQuer ...

  7. 使用rabbitmq rpc 模式

        服务器端     安装 ubuntu 16.04 server     安装 rabbitmq-server     设置 apt 源 curl -s https://packagecloud ...

  8. 调用android系统相机拍照并保存

    [java] view plaincopyprint? <span style="font-size:18px;">package com.demo; import j ...

  9. hdu 1598 find the most comfortable road(并查集+枚举)

    find the most comfortable road Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  10. Idftp.DirectoryListing 里面的内容为什么会是空的呢?(转)

    最近在项目中要用到FTP上传,用的是delphi的IdFTP控件,用IdFtp.List(list),发现List里面有内容,可 是到IdFtp.DirectoryListing.Items[iCou ...