题目

题目地址:https://leetcode-cn.com/problems/count-number-of-teams/

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

请你返回按上述条件可以组建的作战单位数量。每个士兵都可以是多个作战单位的一部分。

思考过程

这个题目乍一看,就觉得像是贪心或者是DP,最近做了几道DP题,马上就先找有没有最优子结构来导出结果。

但是仔细想了想,找不到什么最优子结构,浪费了不少时间,但是发现了一个规律,即对于任意i来说,以i为根节点构建一颗树,以i开头的任意子节点均满足递增或递减,就可以快速计算出总数目。如题例 [2,5,3,4,1],可以构建2->3->4,5->3->1,5->4->1,这2棵树。其中保存的就是结果,对于深度为3的来说,满足的结果数就是1,对于深度为4来说,满足的结果数就是4,对于深度为5来说的树,满足的结果数就是10,规律也比较简单,深度每加1,增加的结果数就是排列组合求的Cn-1 2,比如深度3为结果1,深度4=1+C3 2=4,深度5=4+C4 2=10。根据这种方法,对数组进行遍历并且构建一颗树,然后进行BFS查看深度进行计算就可以了。并且这种方法是会保留结果的方法。

查看别人分享的思路

虽然有了解法,但是毕竟一开始初衷还是贪心或者DP,还是不甘心,于是看了一下别人分享的题解,确实有比较取巧的解法,是我一开始的思路错了,这种思路简而言之就是对于任意一个i,把他当做中间数,求得左侧小于i的数的个数left_small,左侧大于i的数的个数left_big,右侧小于i的数的个数right_small,右侧大于i的数的个数right_big,此时就有以i为中间数的结果=left_smallright_big+left_bigright_small,这种思路实现简单,缺点是没有保存中间结果,最后上下代码

func numTeams(rating []int) int {
ans:=0
for i:=0;i<len(rating);i++{
left_big:=0
right_big:=0
left_small:=0
right_small:=0
for j:=i-1;j>=0;j--{
if rating[j]>rating[i] {
left_big++
}
if rating[j]<rating[i]{
left_small++
}
}
for k:=i+1;k<len(rating);k++{
if rating[k]>rating[i] {
right_big++
}
if rating[k]<rating[i]{
right_small++
}
}
ans+=left_small*right_big+left_big*right_small
}
return ans
}

总结

最近刷LeetCode,水题太水,有手就行,还是要刷点稍微需要一些思考的题目,才能提升自己,以后尽量坚持3简单+1中等的进度。

leetcode刷题录-1395的更多相关文章

  1. LeetCode刷题专栏第一篇--思维导图&时间安排

    昨天是元宵节,过完元宵节相当于这个年正式过完了.不知道大家有没有投入继续投入紧张的学习工作中.年前我想开一个Leetcode刷题专栏,于是发了一个投票想了解大家的需求征集意见.投票于2019年2月1日 ...

  2. leetcode 刷题进展

    最近没发什么博客了 凑个数 我的leetcode刷题进展 https://gitee.com/def/leetcode_practice 个人以为 刷题在透不在多  前200的吃透了 足以应付非算法岗 ...

  3. LeetCode刷题指南(字符串)

    作者:CYC2018 文章链接:https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/Leetcode+%E9%A2%98%E8%A7% ...

  4. leetcode刷题记录--js

    leetcode刷题记录 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但 ...

  5. LeetCode刷题总结之双指针法

    Leetcode刷题总结 目前已经刷了50道题,从零开始刷题学到了很多精妙的解法和深刻的思想,因此想按方法对写过的题做一个总结 双指针法 双指针法有时也叫快慢指针,在数组里是用两个整型值代表下标,在链 ...

  6. Leetcode刷题记录(python3)

    Leetcode刷题记录(python3) 顺序刷题 1~5 ---1.两数之和 ---2.两数相加 ---3. 无重复字符的最长子串 ---4.寻找两个有序数组的中位数 ---5.最长回文子串 6- ...

  7. LeetCode刷题总结-数组篇(上)

    数组是算法中最常用的一种数据结构,也是面试中最常考的考点.在LeetCode题库中,标记为数组类型的习题到目前为止,已累计到了202题.然而,这202道习题并不是每道题只标记为数组一个考点,大部分习题 ...

  8. LeetCode刷题总结-数组篇(中)

    本文接着上一篇文章<LeetCode刷题总结-数组篇(上)>,继续讲第二个常考问题:矩阵问题. 矩阵也可以称为二维数组.在LeetCode相关习题中,作者总结发现主要考点有:矩阵元素的遍历 ...

  9. LeetCode刷题总结-数组篇(下)

    本期讲O(n)类型问题,共14题.3道简单题,9道中等题,2道困难题.数组篇共归纳总结了50题,本篇是数组篇的最后一篇.其他三个篇章可参考: LeetCode刷题总结-数组篇(上),子数组问题(共17 ...

随机推荐

  1. 解决虚拟机联网问题linux VMware eth0

    虚拟机坏了n多回,真是让我装机装到吐血,经过两天的折腾终于弄明白怎么配置虚拟机的静态ip了. 方法: 1. 将虚拟机关机,--> 打开编辑 ->点击 虚拟网络映射 ->点击 VMne ...

  2. windows上mysql5.7服务启动报错

    安装之后,启动服务 net start mysql,无法启动,日志报错缺少一些系统表,mysql.user等表 解决办法: bin目下执行:mysqld --initialize-insecure - ...

  3. 用 Java 训练出一只“不死鸟”

    作者:Kingyu & Lanking FlappyBird 是 2013 年推出的一款手机游戏,因其简单的玩法但极度困难的设定迅速走红全网.随着深度学习(DL)与增强学习(RL)等前沿算法的 ...

  4. Core3.0中Swagger使用JWT

    前言 学习ASP.NETCore,原链接 https://www.cnblogs.com/laozhang-is-phi/p/9511869.html 原教程是Core2.2,后期也升级到了Core3 ...

  5. Autofac官方文档翻译--一、注册组件--2传递注册参数

    官方文档:http://docs.autofac.org/en/latest/register/parameters.html 二.Autofac 传递注册参数 当你注册组件时能够提供一组参数,可以在 ...

  6. 基于frp的内网穿透实例1-通过SSH访问内网机器

    原文地址:https://wuter.cn/1804.html/ 老母鸡终于到了,作为一个能运行linux系统的四核1G硬件,它还是比较小巧的. FRP 全名:Fast Reverse Proxy.F ...

  7. 每日CSS_纯CSS制作进度条

    每日CSS_纯CSS制作进度条 2020_12_26 源码 1. 代码解析 1.1 html 代码解析 设置整个容器 <div class="container"> . ...

  8. java 常用时间操作类,计算到期提醒,N年后,N月后的日期

    package com.zjjerp.tool; import java.text.ParseException; import java.text.ParsePosition; import jav ...

  9. h5问题总结

    一.下拉刷新上拉加载 主要依赖一款插件mescroll.js  http://www.mescroll.com/ 简单好用.以前同事的用法是初始化执行执行上拉会调,页数从0开始,下拉重新加载当前地址走 ...

  10. Linux嵌入式学习-交叉编译mplayer

    http://bbs.gkong.com/archive.aspx?ID=286721