寻找最小未出现的正整数

发布于:2023-01-04 ⋅ 阅读:(290) ⋅ 点赞:(0)

系列目录:

 左右移动(旋转)数组元素

查找两个升序数组的中间数

判断数组的某一个元素的数量是否超过了整个数组数量的一半

合并两个有序表到新的有序表

顺序表前m和后n元素交换位置

文图介绍 

列如数组A:未出现的最小正整数为5

A
1 2 3 4

 一、实现算法思想: 

方法一:

创建一个计数为min,初始化min的值为1,依次比较数组的值,如果没有那么min就等于1;

如果有,则min+1,再次比较。直到没有为止!

方法二:

创建一个和数组A一样大小为n的数组B,并初始化为0,判断A数组是否存在1-n之间的数(最小未出现正整数的范围在1-n+1,故大于n或小于1的数不用考虑),如果存在,则让B数组的对应的下标[A[i]-1]=1,标记为1,直到数组扫描完。

再扫描数组B,第一个出现为0的元素就是最小值,即数组下标加1。

提示:自己动手画图后思路更加清晰 ! 

二、实现代码  

//方法一:
int FindNotExistSmall(int A[], int n)
{
	int min = 1;
	while (min<=n+1)
	{
		for (int i = 0; i < n; i++)
		{
			if (min == A[i])
			{
				break;
			}
			if (i == n - 1)//如果没有说明就到了最后一个
			{
				return min;
			}
		}
     min++;
	}
}
//方法二:
int FindNotExistSmall(int A[])
{
	int i;
	int B[n]={0};//初始为0
	for ( i = 0; i < n; i++)
	{
		if (A[i]>0&&A[i]<=n)
		{
			B[A[i] - 1] = 1;//如果1出现了,则在下标为0位置标记为1,5出现了则,下标为4的位置标记为1
		}
	}
	for ( i = 0; i < n; i++)//再扫描B数组
	{
		if (B[i]==0)
		{
			break;//碰到第一个为0直接结束
		}
	}
	return i + 1;//下标加1为最小值

}

三、运行结果 

自己运行

四、总结 

以上就是本章要讲的内容,本文简单介绍了怎么样查找未出现的最小正整数,提供了能使我们快速便捷地思路和方法。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到