数组翻转


解题思路1:
1.先找出非升序排列的那一段,标记为start和end,找出的思路是:从前向后遍历如果发现有后面的数大于前面的数那么这就是start的位置,然后break,从后向前遍历,如果有个数比start位置的数小,则end的位置就确定了;

2.根据找出的start和end的位置,end处的数是不是比start-1处的数大,start处的数是不是比end+1处的数小,注意不能越界;

3.遍历start到end的子数组,看是否为严格递减;

4通过以上的判断就能判断数组是否满足翻转的要求。


解题思路2:

1.先将数组排序然后与原数组分别从前和从后对比,找出start和end的位置;

2.然后对两个start到end的段分别比对,看原数组的start+i和排序后的数组end-i是否相等,来判断是否满足翻转的要求。


贴上思路一的代码:

#include <iostream>
#include <malloc.h>


using namespace std;


int main()
{
int num;
static int start, end;
bool flag =false;
cin >> num;
int* arr = (int*)malloc((num + 1)*sizeof(int));
for (int m = 0; m < num; m++)
{
cin >> arr[m];
}
for (int i = 1; i < num; i++)
{
if (arr[i - 1] > arr[i])
{
start = i - 1;
break;
}
}
for (int j = num-1; j > 0; j--)
{
if (arr[j] < arr[start])
{
end = j;
break;
}
}
for (int k = start; k < end; k++)
{
if (end < num && arr[start] > arr[end + 1])
break;
if (start > 0 && arr[start - 1] > arr[end])
break;
if (arr[k] < arr[k + 1]) 
{
break;
}
if (k == end-1) flag = true;
}
if (flag)  cout << "yes";
else cout << "no";
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值