寻找递增的三元子序列——C++实现

来源:互联网 发布:js控制多行tr显示隐藏 编辑:程序博客网 时间:2024/05/29 02:30

题目来自九章算法公众号

1.题目描述

给出一个无序的整数序列,返回是否存在递增的三元组子序列。
如果存在 i, j, k 使得 arr[i] < arr[j] < arr[k] and 0 < i < j < k < n-1,即返回true;如果不存在则返回false。
请给出一个O(N)时间复杂度以及O(1)额外空间的算法。
Example 1:
[1, 2, 3, 4, 5]
返回true。
Example 2:
[5, 4, 3, 2, 1]
返回false。

2.思路分析

时间复杂度为O(N),因此,我们只能进行一层循环;而另一方面,空间复杂度被限制在O(1),所以我们的数组数量是常数,不能受到数据长度的影响。
思路如下:
1.开两个数组arr1[3], arr2[3];
2.找到一个数,放在arr1的第一个位置;
3.接着下一个数,如果小于arr1[0],则替换掉它,仍进行步骤3;若大于arr1[0],则放在第二位,进入下一步;
4.接下来找到的数要和arr1[1]进行比较,若大于arr1[1],则满足要求,退出程序;若小于它,则存放在第二个数组里,进入下一步;
5.接下来找的数首先要和arr1[1]比较,若大于它则满足要求,若小于它,则要和arr2[0]比较,如果小于则替换,如果大于,则放在arr2[1],此时我们要用2号数组覆盖1号数组,因为接下来能够让1号数组实现的必能让2号数组实现,所以我们可以放心大胆地覆盖掉他,此时返回到步骤4;

3.C++代码实现

#include <iostream>int main(){    int n, i, step;//step记录步骤    int *arr;    int arr1[3] = { 0 };    int arr2[3] = { 0 };    bool find;    while (std::cin >> n){//输入数字个数        arr = new int[n];        step = 0;        find = 0;        for (i = 0; i < n; i++){            std::cin >> arr[i];        }        for (i = 0; i < n; i++){            std::cout << step << std::endl;            switch (step){            case 0:{//找到第一个初始数                arr1[0] = arr[i];                step++;                break;            }            case 1:{//找第一个数组的第二位                if (arr[i] > arr1[0]){                    arr1[1] = arr[i];                    step++;                    break;                }                else if (arr[i] < arr1[0]){//如果小于就替换                    arr1[0] = arr[i];                    break;                }                break;            }            case 2:{//找第二个数组的第一位                if (arr[i]>arr1[1]){                    find = 1;                    break;                }                else if (arr[i] < arr1[1]){                    arr2[0] = arr[i];                    step++;                    break;                }                break;            }            case 3:{//找第二个数组的第二位                if (arr[i] > arr1[1]){                    find = 1;                    break;                }                else if (arr[i] < arr2[0]){                    arr2[0] = arr[i];                    break;                }                else if (arr[i] > arr2[0]){//数组覆盖                    arr1[0] = arr2[0];                    arr1[1] = arr[i];                    arr2[0] = 0;                    step = 2;                    break;                }                break;            }            }            if (find == 1)                break;        }        if (find)            std::cout << "true" << std::endl;        else            std::cout << "false" << std::endl;    }}
0 0
原创粉丝点击