【C002】求数组中比左边元素都大同时比右边元素都小的元素,返回这些元素的索引

求数组中比左边元素都大同时比右边元素都小的元素,返回这些元素的索引

一、问题描述

求数组中比左边元素都大同时比右边元素都小的元素,返回这些元素的索引

二、第一次实现

1.算法描述

本例将所有返回元素存放在一个数组中,用结构体返回数组的起始地址和元素个数

2.源代码

结构体定义:

typedef struct{
	int* ArrayAddress;
	int LengthOfArray;
}output;

主函数:

main()
{
	output* output1;
	int a[] = { 1, 2, 3, 1, 5, 6, 7, 9 };
	int i = 0;
	output1 = find(a, (sizeof(a)/sizeof(a[0])));
	for (i = 0; i < (output1->LengthOfArray); i++)
	{
		printf("%d\t", *(output1->ArrayAddress++));
	}
}

功能函数

output* find(int* Array, int ArraySize)
{
	int *SaveOut=NULL, *SaveOutP = NULL;
	int i = 0;
	output* output1;
	output1 = (output*)malloc(sizeof(output));
	SaveOut = (int*)malloc(ArraySize * sizeof(SaveOut));
	/*initialize the SaveOut*/
	for (i = 0; i < ArraySize; i++)
	{
		SaveOut[i] = 0;
	}
	SaveOutP = SaveOut;
	for (i = 1; i < ArraySize; i++)
	{
	/*Start traversing every element of Array;
	*Saving every bigger number to the element pointed by SaveOutP when traversing and move forward the SaveOutP and Array[i];
	*but if you encounter a lower than it ,you should clear the element pointed to by the pointer SaveOutP and let SaveOutP move a step back (Array[i] keep itself)
	*/
		/*Move forward*/
		if (*(Array+i) > *(Array+*SaveOutP))
		{
			SaveOutP++;
			*SaveOutP = i;
		}
		/*Move back*/
		else
		{
			while ((*(Array + i) <= *(Array + *SaveOutP)) & (SaveOutP != SaveOut))
			{
				*SaveOutP = 0;
				SaveOutP--;
			}
		}
	}
	SaveOutP = SaveOut;
	while (*(++SaveOutP))
	{
	}
	output1->ArrayAddress = SaveOut + 1;
	output1->LengthOfArray = SaveOutP - SaveOut - 2;
	return output1;
}

三、改进提示

我们先假设一个数组中有两个元素x和y满足题目条件,且再假设a是小于x的元素块,b是介于x和y之间的元素块,c是大于y的元素块,则可以证明若x和y满足条件,那么元素块b也满足条件,所以说满足题目条件的元素的所以是一系列连续的整数值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xfDenny

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值