• 1395. Count Number of Teams


    package LeetCode_1395
    
    /**
     * 1395. Count Number of Teams
     * https://leetcode.com/problems/count-number-of-teams/
     * There are n soldiers standing in a line. Each soldier is assigned a unique rating value.
    You have to form a team of 3 soldiers amongst them under the following rules:
    Choose 3 soldiers with index (i, j, k) with rating (rating[i], rating[j], rating[k]).
    A team is valid if: (rating[i] < rating[j] < rating[k]) or (rating[i] > rating[j] > rating[k]) where (0 <= i < j < k < n).
    Return the number of teams you can form given the conditions. (soldiers can be part of multiple teams).
    
    Example 1:
    Input: rating = [2,5,3,4,1]
    Output: 3
    Explanation: We can form three teams given the conditions. (2,3,4), (5,4,1), (5,3,1).
    
    Example 2:
    Input: rating = [2,1,3]
    Output: 0
    Explanation: We can't form any team given the conditions.
    
    Example 3:
    Input: rating = [1,2,3,4]
    Output: 4
    
    Constraints:
    1. n == rating.length
    2. 3 <= n <= 1000
    3. 1 <= rating[i] <= 10^5
    4. All the integers in rating are unique.
     * */
    class Solution {
        /*
        * solution 1: bruce force, Time:O(n^3), Space:O(1)
        * solution 2: dp, Time:O(n^2), Space:O(1)
        * */
        fun numTeams(rating: IntArray): Int {
            var result = 0
            val n = rating.size
            val dp = IntArray(n)
            for (i in 1 until n) {
                var increasingCount = 0
                for (j in 0 until i) {
                    if (rating[j] < rating[i]) {
                        increasingCount++
                        /*
                        * like j in the middle, if (rating[j]<rating[i]), find out one result matching:
                        * rating[j-1]<rating[j]<rating[i],
                        * dp[j]: meaning there are how many number less than rating[j], from index_0 to index_j,
                        * */
                        result += dp[j]
                    }
                    //dp[i]: there are how many number less than rating[i], from index_0 to index_i,
                    dp[i] = increasingCount
                }
            }
            //reset dp arra and reverse rating to do again, just like decreasing
            for (i in 0 until n) {
                dp[i] = 0
            }
            rating.reverse()
    for (i in 1 until n) { var increasingCount = 0 for (j in 0 until i) { if (rating[j] < rating[i]) { increasingCount++ result += dp[j] } dp[i] = increasingCount } } return result } }
  • 相关阅读:
    HDU 4763 Theme Section(KMP+枚举公共前后缀)
    HDU 3613 Best Reward(扩展KMP求前后缀回文串)
    HDU 3613 Best Reward(manacher求前、后缀回文串)
    扩展KMP模板
    Vue
    Vue
    css 文本换行 文本溢出隐藏用省略号表示剩下内容
    sublime 神一样的插件
    markdown
    css 居中布局
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/14317185.html
Copyright © 2020-2023  润新知