1395. Count Number of Teams
Best solution
T: O(n^2)
S: O(1)class Solution {
public int numTeams(int[] rating) {
int n = rating.length;
int result = 0;
for (int middle = 0; middle < n-1; middle++) {
int leftSmaller = 0;
int rightLarger = 0;
// asc part
for (int left = 0; left < middle; left++) {
if (rating[left] < rating[middle]) {
leftSmaller++;
}
}
for (int right = middle+1; right < n; right++) {
if (rating[middle] < rating[right]) {
rightLarger++;
}
}
result += leftSmaller*rightLarger;
// desc part
int leftLarger = middle - leftSmaller;
int rightSmaller = n - middle - 1 - rightLarger;
result += leftLarger*rightSmaller;
}
return result;
}
}
/**
T: O(n^2)
S: O(1)
use greedy & dp solution
because it said "3 soliders"
asc or
x i x j x k x
desc
x i x j x k x
if we use middle one... then find left side smaller, and right side larger
ex:
[1, 2,5,3,4,1, 6]
now mid is 3 -> so left side smaller = [1,2], right side larger = [4, 6]
so for mid is 3, there is 2*2 = 4 ways to have asc teams
vice versa, for desc
for mid is 3 -> so left side "larger" = [5], right side "smaller" = [1]
so there is 1*1 way to have desc team
so for 3 there is 4+1 ways
so we can use a loop to fix middle, then use another loop to find left part, right part larger and smaller
sum up them, it is the ans
*/DFS + memo
Previous3291. Minimum Number of Valid Strings to Form Target INext873. Length of Longest Fibonacci Subsequence
Last updated
Was this helpful?