算法小例
来源:互联网 发布:矩阵转置运算法则 编辑:程序博客网 时间:2024/06/10 11:53
翻转数组
题目描述给定一个长度为n的整数数组a,元素均不相同,问数组是否存在这样一个片段,只将该片段翻转就可以使整个数组升序排列。其中数组片段[l,r]表示序列a[l], a[l+1], ..., a[r]。原始数组为
a[1], a[2], ..., a[l-2], a[l-1], a[l], a[l+1], ..., a[r-1], a[r], a[r+1], a[r+2], ..., a[n-1], a[n],
将片段[l,r]反序后的数组是
a[1], a[2], ..., a[l-2], a[l-1], a[r], a[r-1], ..., a[l+1], a[l], a[r+1], a[r+2], ..., a[n-1], a[n]。
1.数组必须要翻转一次, 才符合题意
2.找到数组翻转的起始位置和结束位置
a.起始位置为数组开始降序的前一个元素
b.结束位置为数组降序后开始升序前一个元素
如下图, 数组翻转的元素是a1,a2,a3
3.第一次翻转之后, 检查数组是否为升序
二. 解题代码
#include <iostream>using namespace std;int main(){ int n; cin>>n; int aiArr[n]; int iStartIndex = -1; int iEndIndex = -1; for(int i=0; i<n; i++) { cin>>aiArr[i]; if(i>0&&iStartIndex<0&&aiArr[i]<aiArr[i-1]) { iStartIndex = i-1; } if(iStartIndex>-1&&iEndIndex<0&&aiArr[i]>aiArr[i-1]&&aiArr[i]>aiArr[iStartIndex]) { iEndIndex = i-1; } } if(iStartIndex<0&&iEndIndex<0) { cout<<"no"<<endl; } else { if(iStartIndex>=0&&iEndIndex<0) iEndIndex = n-1; for(int i=iStartIndex,j=iEndIndex;i<j;i++,j--) { int iTemp = aiArr[i]; aiArr[i] = aiArr[j]; aiArr[j] = iTemp; } bool bFind = 0; for(int i=0;i<n-1;i++) { if(aiArr[i]>aiArr[i+1]) { bFind = 1; break; } } if(bFind) { cout<<"no"<<endl; }else { cout<<"yes"<<endl; } } return 0;}
三. 优质解答
精妙处:
1.从收尾两端寻找翻转数组的开始和结束位置
2.通过翻转数组与排好序的数组进行对比,快速判断翻转能否有序
#include <iostream>#include <algorithm>using namespace std;int main(){int n;scanf("%d", &n);int arr[n]; int sortArr[n]; for(int i = 0; i < n; i++){scanf("%d", &arr[i]);sortArr[i]=arr[i];}sort(sortArr, sortArr + n);int start = 0, end = n - 1;while(start < n && arr[start] == sortArr[start])start++;while(end >= 0 && arr[end] == sortArr[end])end--;bool ok = true;while(start < end){if(sortArr[start] != arr[end]){ok = false;break;}start++, end--;}if(ok)printf("yes\n");else printf("no\n");return 0;}
阅读全文
0 0
- 递归算法小例
- 算法小例
- javascript 算法笔记-小例
- 小算法
- 小算法
- 小代码、小算法
- 容器,迭代器,算法使用小例
- 【模板】基础算法&&小算法
- 一个小算法
- 模式匹配小算法
- 模式匹配小算法
- 两个小算法题
- 几个小算法
- 小试 A*算法
- PHP 分页小算法
- 几个小算法
- java 小算法
- 一个小算法题
- 数据库连接池原理
- web中将DataTable作为数据源导出Excel (带格式)
- 安装Zookeeper
- linux常用命令
- 八大排序算法-及运行时间测试
- 算法小例
- C++中为什么要用指针,而不直接使用对象?
- 解题报告:Codeforces Round #193 (Div. 2) C. Students' Revenge 贪心
- 前端经典面试题2
- 栈的基础
- 使用C语言编程的3个优化等级
- 编译安装openresty+mysql+php7
- Python-Python入门
- AS中使用自己编译的jar替换环境jar