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

题目:在一个整型数组中有一个元素的出现次数超过了数组长度的一半,试设计一个 在时间上尽可能高效的算法,找出这个元素。要求:
(1)给出算法的基本设计思想。
(2)根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释。
(3)说明你所设计算法的时间复杂度和空间复杂度。

(1)基本的设计思想:
一个数字出现的次数超过了长度的一半, 那么我们可以这样认为这个数字出现的个数一定大于其他全部数字出现的个数之和。算法的步骤如下:
①设数组为data[],数组长度为n,i=1。置currentAxis=data[0],currentNum=1。
②当data[i]==currentAxis时,currentNum++,转向④;否则转向③。
③currentNum--,当currentNum==0时,currentAxis=data[i]。
④当i==data.length时, 转向⑤;否则,i++,转向②;
⑤返回currentAxis。

(2)算法实现:

#include<iostream>
using namespace std;

int funtion(int data[],int length)
{
    int currentAxis; //假设要求的元素的位置
    int currentNum = 0; //要求元素的个数变量
    for(int i =0;i<length;i++)
    {
        if(currentNum ==0){
        //如果要求的元素还没出现,设置要求的元素为现在要比较的元素
            currentAxis=data[i];
            currentNum=1;
        }
        else
        {
            if(currentAxis==data[i])
            //假设的结果与比较元素不同,假设结果个数增1,否则减1
                currentNum++;
            else
                currentNum--;
        }
    }
    return currentAxis; //返回最终结果的位置。
}
int main()
{
    int arr[]={1,2,3,2,5,6,2,2,3,2,2,4};
    cout<<"number="<<funtion(arr,12)<<endl;
    return 0;
}

(3)时间复杂度为O(n)。空间复杂度O(1)。
【另解】本题最直接的方法就是对每个数字进行排序。然后输出出现次数最大的数字即可,但排序的时间复杂度最快也要O(nlog2n)。

 

时间: 2024-12-31 16:22:56

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

C语言删除无序整型数组中的重复元素及时间复杂度

遇到一个题,大概要求是写一个函数处理来去掉一个无序的整型数组(例如int i_arr[] = { 1, 2, 2, 3, 4, 2, 3, 5 };)中重复的元素,并返回最终的长度. 1 思路 看到这道题的时候,第一反应就是需要删除元素,然后联想到单链表.但是后面一想还是不划算,因为单链表还得先把数组中的元素遍历到链表节点中. 换一下思路,可以先创建另一个整型数组(大小和原数组一样),然后正向遍历数组中的元素,比较当前元素和它前面所有的元素是否重复,如果这个整数之前没有出现过,那么就放到新的数组

C++按照正态分布来排列整型数组元素_C 语言

题目要求如下: 给定一个数组input[], 如果数组长度n为奇数,则将数组中最大的元素放到output[]数组最中间的位置, 如果数组长度n为偶数,则将数组中最大的元素放到 output[] 数组中间两个位置偏右的那个位置上, 然后再按从大到小的顺序,依次在第一个位置的两边,按照一左一右的顺序,依次存放剩下的数. 这种处理后结果,如果按照元素的值表示一种分布的图形的话,那绘制后的图形应该是正态分布. 关于正态分布: 正态分布(Normal distribution)又名高斯分布(Gaussia

怎么取得整型数组中连续相同的数字并输出打印,用java实现,也就是输出副本,只输出那些连续相同的数字

问题描述 怎么取得整型数组中连续相同的数字并输出打印,用java实现,也就是输出副本,只输出那些连续相同的数字 怎么取得整型数组中连续相同的数字并输出打印,用java实现,也就是输出副本,只输出那些连续相同的数字 解决方案 判断一下一个数字前后是否有相同的,有相同的话就输出,比如下面这样: int array [] = { 2,1,3,4,4,4,9,9,1,0,1,1,2 }; //只输出连续的数字 System.out.print("连续数字:"); for (int i=0;i&

c语言-关于整型数组中数字使用printf输出的问题

问题描述 关于整型数组中数字使用printf输出的问题 #include int main(void) { int number[40]; scanf("%s", number); printf("%d", number[0]); return 0; } 数字以字符格式存在数组里,既然字符以数字的形式存储,那为何用%d输出是垃圾值呢?用%c却是正常的 解决方案 字符格式和整型是不同的,字符0对应着48,字符1对应着整数49.... 解决方案二: 字符'0',对应0x

c语言,对结构体中的整型数组进行赋值.....

问题描述 c语言,对结构体中的整型数组进行赋值..... c语言中,在结构体里声明整型数组,想对整型数组赋值,只能用循环吗?如果我想这样呢..... typedef struct Data { int arr[10]; }Data; int main() { Data data; data = (Data)malloc(sizeof(Data)); data->arr[10]={1,3,2,4,5,6,7,8,9,0}; . ... ... ... } 这样可以吗? 解决方案 绝对不可以.数组作

[经典面试题][百度]在由N个正整数的集合S中,找出最大元素C,满足C=A + B

[题目] 在由N个正整数的集合S中,找出最大元素C,满足C=A + B 其中A,B都是集合S中元素,请给出算法描述,代码与时间复杂度分析. [分析] 1,对集合S进行排序(快排),从小到大排序2,让C指向集合最后一个元素(最大元素)3,让i指向S中第一个元素,让j指向C的前一个元素4,如果,A[i]+A[j]==C则return C;5,如果if(A[i]+A[j]<C)则i++;6,如果if(A[i]+A[j]>C)则j--;7,直道i>=j依然没有找到符合条件的元素,则C在S中向前移

List中有三个整型数组对象,如何比较数组对象中的元素

问题描述 三个数组长度一样,我想比较三个数组对象的第一个元素,找出最大的保留,以此类推:int[]a1=newint[]{3,6,5,0};int[]a2=newint[]{1,9,7,6};int[]a3=newint[]{5,3,5,8};比较后得到新数组对象ax=newint[]{5,9,7,8};请问如何在List中实现呢?thanks 解决方案 解决方案二:笨办法:1.循环数组长度次2.每次比较3个数,取最大数3.存入新数组解决方案三:能给个确切的例子吗?谢过了解决方案四:int[]a

贪心算法-找出一个-1,0,1三值矩阵中的最大全1子块

问题描述 找出一个-1,0,1三值矩阵中的最大全1子块 并不要求子块仍为一个矩阵,但要求形状为凸多边形,可进行行列变换,只要求所求子块最大. 我的理解是:用贪心法找出一个连续的最全1块,再进行行列变换保证子块形状为凸. 数据量较大,文件形式给出.

整型数组转换为字符串

package cn.ic; //将一个整形数组转换成字符串,然后输出 public class StringTest1 { public static void main(String[] args) { StringDemo1 demo1=new StringDemo1(); int array []=new int []{1,2,3,4}; System.out.println(demo1.method(array)); } } class StringDemo1{ public Stri