• 需要排序的最短子数组长度


    题目:给定一个无序数组长度arr,求出需要排序的最短子数组长度。如输入:arr={2,3,7,5,4,6},返回4,因为只有{7,5,4,6}需要排序。注意这儿题目是要求数组按照递增排序。

    代码:

     1 public class Rearrange {
     2     public static int findSegment(int[] A, int n) {
     3         // p1 p2为需要排序的子数组边界
     4         int p1 = -1;
     5         int p2 = -1;
     6         int max = A[0];
     7         int min = A[n - 1];
     8         //拓展右端点:更新历史最高,只要右侧出现比历史最高低的,就应该将右边界扩展到此处
     9         for (int i = 0; i < n; i++) {
    10           if (A[i] > max) {
    11             max = A[i];
    12           }
    13           //只要低于历史高峰,就要扩展需排序区间的右端点
    14           if (A[i] < max)
    15             p2 = i;
    16         }
    17         //找左端点:更新历史最低,只要左侧出现比历史最低高的,就应该将左边界扩展到此处
    18         for (int i = n - 1; i >= 0; i--) {
    19 
    20           if (A[i] < min) {
    21             min = A[i];
    22           }
    23           if (A[i] > min)
    24             p1 = i;
    25         }
    26 
    27         if (p1 == -1) {
    28           return -1;
    29         }
    30         // p1 p2为需要排序的子数组边界 所以应该返回长度 p2-p1+1
    31         return p2-p1+1;
    32       }
    33     public static void main(String[] args) {
    34         int res = findSegment(new int[]{2,3,7,5,4,6}, 6);
    35         System.out.println(res);   // 输出 4
    36     }
    37 }

    总结:拿到这种题目,需要仔细分析,然后发现规律,并且在分析的过程中要考虑各种测试用例,小数据、大数据、反例、边界数据、时间复杂度等等。那这道题目本身没有什么算法可言,只有自己去寻找规律解决。

  • 相关阅读:
    CCF CSP 201709-1 打酱油 (贪心)
    CCF CSP 201712-1 最小差值
    CCF CSP 201612-1 中间数
    CCF CSP 201609-1 最大波动
    CCF CSP 201604-1 折点计数
    CCF CSP 201512-1 数位之和
    CCF CSP 201509-1 数列分段
    CCF CSP 201503-1 图像旋转 (降维)
    CCF CSP 201412-1 门禁系统
    CCF CSP 201409-1 相邻数对
  • 原文地址:https://www.cnblogs.com/xiaoyh/p/10288651.html
Copyright © 2020-2023  润新知