我试图找到一个数组的最小值然后检查最小值频率,但问题是如果数组的大小和它存储的值很大,我的代码不起作用。
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
用于检查频率是奇数还是偶数
答案 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])
{
...
在i
为N-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的次数。