(C++)求出该序列中元素的所有最大升、降子序列

题目:

已知输入序列中各元素的值至少有两个元素。设计算法求出该序列中元素的所有最大升、降子序列。例如,若元素依次为(1,20,30,12,3,5,7,4,6,100,11,8),则输出结果为(1,20,30),(30,12,3),(3,5,7),(7,4),(4,6,100),(100,11,8)。

思想:

其实这个代码还应该加一个,如果a.size()==2,直接输出,goto结束程序。懒得弄了。

思想主要是,设置头尾指针(start = 0,end),从头遍历数组,若该元素前后大小于关系不一致,该店就是end点,然后从start到end输出。输出完成后将该点设置成新的start点。

等到下一个end发现时再继续上述步骤。

若是遍历到倒数第二个点,将最后一个点设置为end点,最后一次输出。

代码:

#include <iostream>
#include <vector>
using namespace std;
 
int main(int argc, char** argv) {
	cout<<"—————— 逐个输入数组元素 , 以空格隔开  —————— "<<endl;
	vector<int> a;
	int i = 0;
	do{
		cin >> i;
		a.push_back(i);
	}while(getchar() !='\n');
	int start = 0;
	int end; 
	for(int i = 1; i < a.size()-1; i++){
        if( ((a[i-1]>a[i]) & (a[i]<a[i+1]) ) | ( (a[i-1]<a[i]) & (a[i]>a[i+1]) ) ){
        	end = i;
        	cout<<"(";
        	for(int j=start; j<end+1;j++){
        		cout<<a[j];
        		if(j!=end) cout<<",";
			}
			cout<<")"<<endl;
			start = end;
		}
		if(i==a.size()-2){
			end = a.size()-1;
			cout<<"(";
        	for(int j=start; j<end+1;j++){
        		cout<<a[j];
        		if(j!=end) cout<<",";
			}
			cout<<")"<<endl;
		}
    }
	return 0;
}

—————— 逐个输入数组元素 , 以空格隔开  ——————
1 20 12 3 5 7 4 6 100 11 8
(1,20)
(20,12,3)
(3,5,7)
(7,4)
(4,6,100)
(100,11,8)

------------------------------------------------------------------------------------


版权声明:本文为Drifter_Galaxy原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。