描述有 N 个人排成一排假设他们的身高均为正整数请找出符合以下条件的人数:排在他前面且比他高的人数与排在他后面且比他高的人数相等。输入描述第一行为一个正整数 N 表示有多少个人。下面 N 行每行一个正整数表示从前往后每个人的身高假设每个人的身高=10000。输出描述一行一个整数表示满足这个条件的人数。用例输入 1 41213用例输出 1 2cpp语言
解题思路: 首先遍历每个人,对于每个人 i,统计前面比他高的人数 preCnt[i],再统计后面比他高的人数 postCnt[i]。 然后再遍历每个人,判断 preCnt[i] 是否等于 postCnt[i],如果相等则满足条件,将计数器加一。 最后输出计数器的值。
具体实现:
- 读取输入的人数 N。
- 定义一个数组 heights,用来存储每个人的身高。
- 定义两个数组 preCnt 和 postCnt,分别用来存储每个人前面和后面比他高的人数。
- 读取每个人的身高,并分别统计 preCnt 和 postCnt。
- 定义一个计数器 count,用来记录满足条件的人数。
- 遍历每个人,判断 preCnt[i] 是否等于 postCnt[i],如果相等则 count 加一。
- 输出 count 的值。
代码实现(C++):
#include <iostream>
#include <vector>
using namespace std;
int main() {
int N;
cin >> N;
vector<int> heights(N);
vector<int> preCnt(N, 0);
vector<int> postCnt(N, 0);
for (int i = 0; i < N; i++) {
cin >> heights[i];
}
for (int i = 1; i < N; i++) {
for (int j = 0; j < i; j++) {
if (heights[j] > heights[i]) {
preCnt[i]++;
}
}
}
for (int i = N - 2; i >= 0; i--) {
for (int j = N - 1; j > i; j--) {
if (heights[j] > heights[i]) {
postCnt[i]++;
}
}
}
int count = 0;
for (int i = 0; i < N; i++) {
if (preCnt[i] == postCnt[i]) {
count++;
}
}
cout << count << endl;
return 0;
}
复杂度分析: 该算法的时间复杂度为 O(N^2),空间复杂度为 O(N)。由于题目给出了身高的范围在 1 到 10000,所以算法的时间复杂度是可接受的
原文地址: https://www.cveoy.top/t/topic/iEJb 著作权归作者所有。请勿转载和采集!