寻找递增的三元子序列——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
- 寻找递增的三元子序列——C++实现
- 寻找最长递增子序列
- 寻找最长递增子序列
- 寻找最长递增子序列
- 寻找最长递增子序列
- 寻找最长递增子序列 的两方法效率比较
- Leetcode#334 Increasing Triplet Subsequence(递增三元子序列)
- Facebook 2016 面试题1 | 递增三元组子序列
- 最大递增子序列——POJ1836
- 算法——最长递增子序列
- 算法导论—最长递增子序列
- 三种寻找最长递增(减)子序列的方法【LIS】
- 最长递增子序列(LIS)的两种实现
- dp最长递增子序列的nlogn算法实现
- 用二分法寻找最长连续单调递增子序列
- LIS最长递增子序列DPC++实现
- LIS 最长递增子序列 Java实现
- 动态规划——最长递增子序列
- 面向对象程序设计与分析--ATM类图文档
- za
- C++实现链表直接选择排序
- xdoj 1056: 寻找BOSS
- Q(这个题提交失败,但样例是对的QAQ,好像服务器有问题,不能提交)
- 寻找递增的三元子序列——C++实现
- SpringBoot开发详解(五)--Controller接收参数以及参数校验
- vsftpd 的安装和配置
- PHP设计模式系列(二十三):访问者模式
- java复习——一维数组
- CodeForces 732 B.Cormen — The Best Friend Of a Man(贪心)
- UVA1025 A Spy in the Metro —— DP
- xdoj 1037: 倍流畅序列
- ACM L: XueXX and Binary