/**
* 用顺序表实现 王道P19 T13
*
* point:
* 此题的时间复杂度为 O ( n )
* 空间复杂度为 O ( n )
*
①算法思想:
* 首先找到所给序列中的最大值,并标记为Max,
* 然后创建一个长度为 Max + 2 的数组并初始化全为 0 ,
* 这个数组的下标为 0 到 Max + 1,
* 这样下标既可以存储 1 到 Max 这 Max 个数,
* 也可以存储所给数组中未出现的最小正整数 Max + 1 这个数(当 1 到 Max 全出现时未出现的最小正整数就是 Max + 1 了),
* 然后遍历所给数列,将所给数列中出现的数字所对应的数组值置 1,
* 再次遍历数组,输出第一个数值为 0 的数组下标。
*
* ②数据结构:
* typedef struct{
* int data[MaxSize];
* int length;
* }SqList;
*
* ③算法设计
*/
#include <stdio.h>
#include <iostream>
#define MaxSize 100
typedef struct{
int data[MaxSize];
int length;
}SqList;
int FindMinPositiveValue(SqList L){
int MaxValue = L.data[0];
for (int i = 1; i < L.length; ++i) {//已经假定最小值是L.data[0]了,所以可以直接从i = 1 开始比较
if(MaxValue < L.data[i])
MaxValue = L.data[i];
}
//申请 MaxValue + 2 个空间才能足够用下标表示 1 到 MaxValue + 1 这 MaxValue + 1 个数
int* Flag = (int*)malloc(sizeof(int) * (MaxValue + 2));
//初始化数组全置为 0
for(int i = 0; i < MaxValue + 2; i++){
Flag[i] = 0;
}
Flag[0] = 1;//题目要求是正整数,所以 0 这边直接置 1
for(int i = 0; i < L.length; i++){
if(L.data[i] > 0)//小于等于 0 的直接忽略
Flag[L.data[i]] = 1;
}
for (int i = 0; i < MaxValue + 2; ++i) {
if(Flag[i] == 0)
return i;
}
return -1;
}
//以下用于测试
void InitList(SqList &L){
for (int i = 0; i < MaxSize; ++i) {
L.data[i] = 0;
}
L.length = 0;
}
void PrintList(SqList L){
for (int i = 0; i < L.length; ++i) {
printf("%d ",L.data[i]);
}
printf("\n");
}
int main(){
SqList L = {{-5,1,3,4}, 4};
PrintList(L);
printf("%d",FindMinPositiveValue(L));
return 0;
}
王道数P19 T13(静态顺序表实现)
于 2022-07-02 21:51:13 首次发布