[Lenguaje C] Una pregunta por día (encuentre todos los números que desaparecen en la matriz)

Encuentra todos los números que faltan en la matriz , el enlace está aquí.
inserte la descripción de la imagen aquí

Permítanme decir brevemente aquí, porque aún no lo he tocado 动态内存,数据结构, por lo que mi conocimiento es limitado e hice todo lo posible 结合题库的评论区para encontrar el que más me convenga 解法. Agregaré varias soluciones cuando tenga la oportunidad en el futuro.

ciclo de violencia

El ciclo de violencia sigue siendo el más fácil de pensar, pero cuanto más fácil es, más consume tiempo, lo que significa que es más fácil exceder el límite de tiempo.
Ideas:

Doble forciclo, 外部控制1~nnúmero, 内部遍历numsmatriz, de dos en dos 比较, 记录el número que no aparece es el número que desaparece

Código:

static int arr[99999];//创建数组
int* finddisappearednumbers(int* nums, int numssize, int* returnsize)
{
    
    
    int count = 0;//计数器
    int n = 0;
    for (int j = 1; j <= numssize; j++)
    {
    
    
        count = 0;//每次进入要重置
        for (int i = 0; i < numssize; i++)
        {
    
    
            if (j == nums[i])
            {
    
    
                count++;
                break;
            }
        }
        if (count == 0)//为0说明未出现
            arr[n++] = j;
    }
    *returnsize = n;
    return arr;
}

Clasificación + discusión por situación

Ideas:

Ordenar es hacer que la matriz sea ordenada y funcione mejor.
Entonces, ¿cuál es el asunto de discutir de acuerdo con la situación?
Establézcalo 1~ncomo una variable de bucle i, atraviéselo,
left=0configúrelo como un subíndice y luego compare nums[left] con i de acuerdo con la situación0 desde el principio . En este momento , debido a que habrá números repetidos, por ejemplo , en este momento, puede usar un ciclo while . En ese momento , se .matrizcolocará en la caso, por lo que la izquierda en el tiempo excederá el límite, en este momento , asignamos los valores no iniciados en el ciclo for restante a la matriz de resultados a su vezleft++

i==nums[left]left++1 2 2 2
i!=nums[left]i

numssizenums[numssize-1]1 2 2 2left==numssizei

Código:

int cmp(int* a, int* b)
{
    
    
    return *a - *b;
}
int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize){
    
    
    qsort(nums,numsSize,sizeof(int),cmp);

    int* res=malloc(sizeof(int) * numsSize);//结果数组,result
    *returnSize=0;
    int left=0;

   for(int i=1;i<=numsSize;i++)
   {
    
    
       if(left<numsSize&&i!=nums[left])//注意:left要放前边,防止短路发生
       {
    
    
           res[(*returnSize)++]=i;
           //*returnsize随着结果数组的增加而增加,
           //最后返回的就是数组大小
       }
       if(left==numsSize)
       {
    
    
           res[(*returnSize)++]=i;
       }
       //while要在最后进行,因为在前边会改变left
       //影响两个if的判断
       while(left<numsSize&&i==nums[left])
       {
    
    
           left++;
       }
   }
    return res;
}

Bienvenidos todos a corregir errores y discutir.

Supongo que te gusta

Origin blog.csdn.net/2301_78636079/article/details/132356650
Recomendado
Clasificación