数组中有一个数字出现的次数超过了数组长度的一半,找出这个数

这个算法的时间复杂度是O(n),另外用了两个辅助变量。
k用于临时存储数组中的数据,j用于存储某个数出现的次数。
开始时k存储数组中的第一个数,j为0,如果数组出现的数于k相等,则j加1,否则就减1,如果j为0,就把当前数组中的数赋给k
因为指定的数出现的次数大于数组长度的一半,所有j++与j--相抵消之后,最后j的值是大于等于1的,k中存的那个数就是出现最多的那个数。
下面这个算法只适合数组中数组中某个数的出现次数超过数组长度一半的数组,符合题意。

c实现

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 int Search(int A[],int len)
 4     {
 5         if(NULL==A || len<=0)
 6         {
 7             return -1;
 8         }
 9
10         int k, j=0;
11         for(int i=0;i<len;++i)
12         {
13             if(j==0)
14             {
15                 k=A[i];
16             }
17             if(k==A[i])
18             {
19                 ++j;
20             }else
21             {
22                 --j;
23             }
24         }
25
26         return k;
27     }
28 void main(){
29     int len=10;
30     int a[10]={4,5,5,2,3,5,2,5,5,5};
31     int result=Search(a,len);
32     printf("%d\n",result);
33 }

java实现

package test;

public class Search {
    public static void main(String[] args) {
    //System.out.println("Hello World!");
        Integer []a={4,5,5,2,3,5,2,5,5,5};
        Integer len= a.length;
        Integer result = search(a,len);
        System.out.println(result);
    }
    public static Integer search(Integer A[],Integer len){
        if(A==null || len<=0)
        {
            return -1;
        }

        Integer k=null, j=0;
        for(Integer i=0;i<len;++i)
        {
            if(j==0)
            {
                k=A[i];
            }
            if(k==A[i])
            {
                ++j;
            }else
            {
                --j;
            }
        }

        return k;
    }
}

参考自:http://blog.csdn.net/iefswang/article/details/7581613

感谢原作者

时间: 2024-12-28 21:51:55

数组中有一个数字出现的次数超过了数组长度的一半,找出这个数的相关文章

C++数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。

#include <iostream> #include <bitset> using namespace std; //数组中超过出现次数超过一半的数字(数组) //题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字. template<int _N> int Grial(bitset<_N> &bt,int a[]) { int check[_N]; for(int i=1;i<=_N;i++) { int count =

C++数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。(牛客剑指offer)

///////////////////////////////////////////////////////// //数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. //例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}. //由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. #include <iostream> using namespace std; int Grial(int a[],int n) { if(n==0)return -1;

【c语言】数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字

题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}, 由于数组中数字2出现了5次,超过数组的长度的一半,因此输出2 一种办法是先把数组排序,那么超过一半的元素一定是数组最中间的元素. 第二种办法比较抽象,设一个变量保存当前值,设一个次数,当前值与下一个值进行比较,如果相等,次数加一,如果不相等,次数减一,如果次数减到0了还是不相等,就把当前值替换掉.代码如下: #include <stdio.h> #includ

数组中有一个数字出现的次数超过数组长度的一半

1 /* 2 ----------------------------------- 3 动态分配需要的内存大小 4 输入数组元素的值 5 通过函数调用,传地址对数组排序 6 循环每个元素,当循环比较某个值时,如果有相等的,计数加1,比较完成后,和cn比较,如果大于cn,那么说明找到,退出循环 7 ----------------------------------- 8 */ 9 10 # include <stdio.h> 11 # include <malloc.h> 12

数组中一个数字出现的次数超过了数组长度的一半,请找出这个数

算法: 1)初始化,设当前数组为arr[],长度为n,当前元素cur=arr[0],元素出现次数为count: 2)遍历数组,若count==0,设cur=arr[i],count=1;否则,转向3) 3)若arr[i]==cur,则count++,否则,转向4) 4)count--,当i==n-1时,转向5),否则i++,转向2) 5)返回cur; 1 int MoreThanHalf(int *arr,int n) 2 { 3 int cur,count=0; 4 for(int i=0;i

在一个整型数组中有一个元素的出现次数超过了数组长度的一半,试设计一个 在时间上尽可能高效的算法,找出这个元素。

题目:在一个整型数组中有一个元素的出现次数超过了数组长度的一半,试设计一个 在时间上尽可能高效的算法,找出这个元素.要求:(1)给出算法的基本设计思想.(2)根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释.(3)说明你所设计算法的时间复杂度和空间复杂度. (1)基本的设计思想: 一个数字出现的次数超过了长度的一半, 那么我们可以这样认为这个数字出现的个数一定大于其他全部数字出现的个数之和.算法的步骤如下: ①设数组为data[],数组长度为n,i=1.置currentAxi

输入一个有序数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字

输入一个有序数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字.如果有多对数字的和等于输入的数字,输出任意一对即可.例如输入数组1.2.4.7.11.15和数字15.由于4+11=15,因此输出4和11. 1 #include<stdio.h> 2 #include<stdlib.h> 3 4 void findTwo(int *array, int len, int sum) 5 { 6 int beg = 0; 7 int end = len-1; 8 int

14.输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。 要求时间复杂度是O(n)

待完善! 转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4259199.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目: 输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字.要求时间复杂度是O(n).如果有多对数字的和等于输

输入一个已经按升序排序的数组和一个数字 ,在数组中查找两个数,使得他们的和是输入的那个数字

package shuzu; /* * 输入一个已经按升序排序的数组和一个数字 * 在数组中查找两个数,使得他们的和是输入的那个数字,要求时间复杂度为o(n) * 如果有多对数字的和等于输入的数字,输出任意一对即可. */ public class demo1 { private static void findAns(int[] data,int sum) { int size=data.length; int begin =0; int end=size-1; while(begin < s