如何在非常大的数组中找到最小值,并在c中的数组内找到大值

时间:2017-08-11 16:26:46

标签: c

我试图找到一个数组的最小值然后检查最小值频率,但问题是如果数组的大小和它存储的值很大,我的代码不起作用。

1< A [i]< 10 ^ 9

1< N< 10 ^ 5 1·; T< 10

这里A是数组,N是数组的大小,T是测试用例的数量

c program

#include<stdio.h>
#include<stdlib.h>

找到最小值

int findMin(int A[], int N)
{
    int min;
    int i;
    if(N>2)
    {
        for(i=0;i<N;i++)
        {
            if( A[i]<=A[i+1])
            {
                min = A[i];
                int temp = A[i];
                A[i]=A[i+1];
                A[i+1] = temp;
            }
        }
    }
    else
    {
        min = A[0];
    }

    return freq(min,A,N);

}

数组中最小值的频率

int freq(int min, int A[], int N)
{
    int i,count=0;
    for(i=0;i<N;i++)
    {
        if(min == A[i])
        {
            count++;
        }
    }

    return count%2;
}

主要()

int main()
{

    int *A,N;
    int i,T;
    scanf("%d",&T);
    while(T>0)
    {
        scanf("%d",&N);
        A = (int *)calloc(N,sizeof(int));
        for(i=0;i<N;i++)
        {
            scanf("%d",&A[i]);
        }
        if(findMin(A,N) == 1)
        {
            printf("Lucky\n");
        }
        else
        {
            printf("Unlucky\n");
        }

        T--;
   }
    return 0;
}

[编辑]编码目标
count%2用于检查频率是奇数还是偶数

2 个答案:

答案 0 :(得分:2)

如果您有兴趣找到数组中的最小值,并且您对“频率”感兴趣,您可以将其定义为最小值的计数是奇数还是偶数,这可能是您需要的?

int findMinAndFreq(int A[], int N){
   if(N == 0){
      printf("Array is empty");
      return 0;
   }
   if(N == 1){
      return 1;
   }

   int min = A[0];
   int count = 1;
   for(int i = 1; i<N; i++){
      if(A[i] == min){
         count++;
      }
      if(A[i] < min){
         min = A[i];
         count = 1;
      }
   }
   return count%2;
}

答案 1 :(得分:2)

问题在于:

    for(i=0;i<N;i++)
    {
        if( A[i]<=A[i+1])
        {
        ...

iN-1时的循环的最后一次迭代中,A[i+i]是超出数组末尾的一个元素。读取数组末尾会调用undefined behavior

您还要移动列表中最小的元素。由于您已经跟踪了最小值,因此无需修改列表。

您应该只将当前元素与min进行比较,而不是检查相邻元素。您也不需要移动元素,也不需要为1的数组添加特殊情况:

int findMin(int A[], int N)
{
    int min;
    int i;

    min = A[0];
    for(i=0;i<N;i++)
    {
        if(A[i] < min)
        {
            min = A[i];
        }
    }

    return freq(min,A,N);
}

您也不需要在列表中循环两次,因为您可以计算在查看列表时看到min的次数。