leetcode力扣刷题打卡
题目:1395. 统计作战单位数
描述: n 名士兵站成一排。每个士兵都有一个 独一无二 的评分 rating 。
每 3 个士兵可以组成一个作战单位,分组规则如下:
从队伍中选出下标分别为 i、j、k 的 3 名士兵,他们的评分分别为 rating[i]、rating[j]、rating[k]
作战单位需满足: rating[i] < rating[j] < rating[k] 或者 rating[i] > rating[j] > rating[k] ,其中 0 <= i < j < k < n
请你返回按上述条件可以组建的作战单位数量。每个士兵都可以是多个作战单位的一部分。
方法1暴力枚举
原代码
class Solution {
public:
int numTeams(vector<int>& rating) {
int n = rating.size();
int ans = 0;
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
for (int k = j + 1; k < n; ++k) {
if ((rating[i] < rating[j] && rating[j] < rating[k]) || (rating[i] > rating[j] && rating[j] > rating[k])) {
++ans;
}
}
}
}
return ans;
}
};
1、暴力枚举会超时,只能另想他法。
方法2
原代码
class Solution {
int func(int x, vector<int> v) {
int lessl = 0, morel = 0, lessr = 0, morer = 0;;
for (int i = 0; i < v.size(); ++i) {
if (i < x) {
if (v[i] < v[x]) {
lessl++;
} else {
morel++;
}
}
if (i > x) {
if (v[i] < v[x]) {
lessr++;
} else {
morer++;
}
}
}
return lessl * morer + morel * lessr;
}
public:
int numTeams(vector<int>& rating) {
int n = rating.size();
int sum = 0;
for (int i = 1; i < n - 1; ++i) {
sum += func(i, rating);
}
return sum;
}
};
思路:
1、左边比它小的 * 右边比它大的 + 左边比它大的 * 右边比它小的。