Sort the Array

简介:
/*
   思路: 
   找到单调下降串的起始位置[l, r]
   如果左边 0...l-1中的最大值 > l...r中的最小值 或者
   r+1...n中的最小值 < l...r中的最大值 都是不能实现排序的! 
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long LL;
int cur, nt;
int cnt;
int num[100005];
int main(){
   int i, n;
   int begin, end;
   int flag;
   int min1, max2;
   while(scanf("%d", &n)!=EOF){
          cnt=cur=0;
       flag=0;
       for(i=1; i<=n; ++i){
          scanf("%d", &nt);
          num[i]=nt;
          if(nt>cur)
             flag=0;
          if(!flag && nt<cur){
             ++cnt;
             flag=1;
             begin=i-1;
             end=i;
          }
          if(flag && nt<cur)
               end=i;
          cur=nt;
       }
      if(cnt==1){
           min1=0x3f3f3f3f;
           if(end!=n)
               min1=num[end+1];
         max2=-0x3f3f3f3f;
         if(begin!=1)
             max2=num[begin-1];
         if(max2>num[end] || min1<num[begin]) 
            printf("no\n");
         else
            printf("yes\n%d %d\n", begin, end);
      }
      else if(cnt==0)
         printf("yes\n1 1\n");
      else printf("no\n");
   }
   return  0;
}
/*
思路:
   将两边单调递增的序列排除(将元素和元素下标一一映射起来,排序之后找到元素和下标映射不同的两个端点),然后中间的那部分就是要翻转的!
最后检查翻转部分的元素和下标是否对应!
   
*/
#include<iostream>
#include<algorithm>
#include<map>
#include<cstdio>
#define M 100005
using namespace std; 
int n;
int a[M], b[M]; 
map<int, int>mp;
int main(){
   int i;
   while(cin>>n){
      for(i=0; i<n; ++i){
         cin>>a[i];
         b[i]=a[i];
      }
      sort(a, a+n);
      for(i=0; i<n; ++i)
        mp[b[i]]=i;
      for(i=0; i<n; ++i)
        a[i]=mp[a[i]];
      int L=-1, R=-1;
      for(i=0; i<n; ++i)
         if(a[i]!=i){
            L=i;
            break;
         } 
      for(i=n-1; i>=0; --i)
         if(a[i]!=i){
            R=i;
            break;
         } 
       int ok=1;
       if(L==-1 || R==-1)
          cout<<"yes"<<endl<<"1 1"<<endl;
       else{
          reverse(a+L, a+R+1);
          
          for(i=L; i<=R; ++i){
             if(a[i]!=i){
                ok=0;
                cout<<"no"<<endl;
                break;
             }
          } 
          
          if(ok)
            cout<<"yes"<<endl<<L+1<<" "<<R+1<<endl; 
       } 
   } 
   return 0;
}









本文转自 小眼儿 博客园博客,原文链接:http://www.cnblogs.com/hujunzheng/p/3885952.html,如需转载请自行联系原作者
目录
相关文章
|
Web App开发 JavaScript 前端开发
学习Array类型看这一篇就够了(Array类型特点,Array原型方法,浏览器sort底层实现,深浅拷贝)
学习Array类型看这一篇就够了(Array类型特点,Array原型方法,浏览器sort底层实现,深浅拷贝)
545 0
|
人工智能 C++ Python
LeetCode 905. Sort Array By Parity
LeetCode 905. Sort Array By Parity
249 0
4.1、Array数组常用的方法(map、push、sort、filter、join、split)
4.1、Array数组常用的方法(map、push、sort、filter、join、split)
547 0
|
人工智能 Windows BI
|
JavaScript
js中数组(Array)的排序(sort)注意事项
直接看代码吧,测试结果也贴在里面了 var arrDemo = new Array(); arrDemo[0] = 10; arrDemo[1] = 50; arrDemo[2] = 51; arrDemo[3] = 100; arrDemo.
1112 0
|
11月前
|
测试技术 PHP 开发者
PHP 数组查找:为什么 `isset()` 比 `in_array()` 快得多?
PHP 数组查找:为什么 `isset()` 比 `in_array()` 快得多?

热门文章

最新文章

  • 1
    PHP 数组查找:为什么 `isset()` 比 `in_array()` 快得多?
    288
  • 2
    Java 中数组Array和列表List的转换
    1024
  • 3
    JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
    735
  • 4
    通过array.reduce()实现数据汇总、条件筛选和映射、对象属性的扁平化、转换数据格式、聚合统计、处理树结构数据和性能优化,reduce()的使用详解(附实际应用代码)
    1566
  • 5
    通过array.some()实现权限检查、表单验证、库存管理、内容审查和数据处理;js数组元素检查的方法,some()的使用详解,array.some与array.every的区别(附实际应用代码)
    682
  • 6
    通过array.every()实现数据验证、权限检查和一致性检查;js数组元素检查的方法,every()的使用详解,array.some与array.every的区别(附实际应用代码)
    482
  • 7
    多维数组操作,不要再用遍历循环foreach了!来试试数组展平的小妙招!array.flat()用法与array.flatMap() 用法及二者差异详解
    324
  • 8
    别再用双层遍历循环来做新旧数组对比,寻找新增元素了!使用array.includes和Set来提升代码可读性
    322
  • 9
    Array.forEach实战详解:简化循环与增强代码可读性;Array.forEach怎么用;面对大量数据时怎么提高Array.forEach的性能
    200
  • 10
    深入理解 JavaScript 中的 Array.find() 方法:原理、性能优势与实用案例详解
    778