描述
输入一组数,我们定义每个数左侧比该数小的最接近该数的数为“相似数”,请编程找出一组数中每个数的“相似数”的值(如果没有符合条件的数,请输出0)。
输入描述
数据的第一行是一个正整数n,表示一共有多少个数。
第二行有n个用空格隔开的正整数,它们从左至右给出了数列中的n个数。这些数保证小于2^31。
【数据规模】
对于80%的数据,n≦10000;
对于100%的数据,n≦200000。
输出描述
输出一行用空格隔开的n个数。
这些数对应于输入数据中的数的“相似数”。如果输入中某个数没有“相似数”(即它左边的数都不比它小),请输出0。
用例输入 1
7 3 1 2 7 6 7 4
用例输出 1
0 0 1 2 2 6 2
思路
这道题是分治和算法优化的综合题型,需要自己先将分治代码写出,在进行时间的优化。
分治代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10;
int a[N];
int n;
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++){
int ans=0;
for(int j=i-1;j>=1;j--){
if(a[j]<=a[i]){
ans=j;
break;
}
}
cout<<a[ans]<<" ";
}
return 0;
}
但是有两个点会TLE!!!
需要栈来优化!
最终代码如下:
#include<bits/stdc++.h>
using namespace std;
stack<int> st;
int n,x;
int main(){
cin>>n;
st.push(0);
for(int i=1;i<=n;i++){
cin>>x;//输入每个数字
//st.top() st.push() st.pop() !st.empty()
while(!st.empty()&&st.top()>=x) st.pop();//栈不为空且栈顶更大
if(!st.empty()){
cout<<st.top()<<" ";//输出栈顶元素或0
}
else{
cout<<0<<" ";
}
//x入栈
st.push(x);
}
return 0;
}
谢谢大家!!!