Encuentra todos los números que faltan en la matriz , el enlace está 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
for
ciclo,外部控制1~n
número,内部遍历nums
matriz, 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ézcalo1~n
como una variable de buclei
, atraviéselo,
left=0
configú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
numssize
nums[numssize-1]
1 2 2 2
left==numssize
i
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.