leetcode刷题录-1395
题目
题目地址: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的更多相关文章
- LeetCode刷题专栏第一篇--思维导图&时间安排
昨天是元宵节,过完元宵节相当于这个年正式过完了.不知道大家有没有投入继续投入紧张的学习工作中.年前我想开一个Leetcode刷题专栏,于是发了一个投票想了解大家的需求征集意见.投票于2019年2月1日 ...
- leetcode 刷题进展
最近没发什么博客了 凑个数 我的leetcode刷题进展 https://gitee.com/def/leetcode_practice 个人以为 刷题在透不在多 前200的吃透了 足以应付非算法岗 ...
- LeetCode刷题指南(字符串)
作者:CYC2018 文章链接:https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/Leetcode+%E9%A2%98%E8%A7% ...
- leetcode刷题记录--js
leetcode刷题记录 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但 ...
- LeetCode刷题总结之双指针法
Leetcode刷题总结 目前已经刷了50道题,从零开始刷题学到了很多精妙的解法和深刻的思想,因此想按方法对写过的题做一个总结 双指针法 双指针法有时也叫快慢指针,在数组里是用两个整型值代表下标,在链 ...
- Leetcode刷题记录(python3)
Leetcode刷题记录(python3) 顺序刷题 1~5 ---1.两数之和 ---2.两数相加 ---3. 无重复字符的最长子串 ---4.寻找两个有序数组的中位数 ---5.最长回文子串 6- ...
- LeetCode刷题总结-数组篇(上)
数组是算法中最常用的一种数据结构,也是面试中最常考的考点.在LeetCode题库中,标记为数组类型的习题到目前为止,已累计到了202题.然而,这202道习题并不是每道题只标记为数组一个考点,大部分习题 ...
- LeetCode刷题总结-数组篇(中)
本文接着上一篇文章<LeetCode刷题总结-数组篇(上)>,继续讲第二个常考问题:矩阵问题. 矩阵也可以称为二维数组.在LeetCode相关习题中,作者总结发现主要考点有:矩阵元素的遍历 ...
- LeetCode刷题总结-数组篇(下)
本期讲O(n)类型问题,共14题.3道简单题,9道中等题,2道困难题.数组篇共归纳总结了50题,本篇是数组篇的最后一篇.其他三个篇章可参考: LeetCode刷题总结-数组篇(上),子数组问题(共17 ...
随机推荐
- 解决虚拟机联网问题linux VMware eth0
虚拟机坏了n多回,真是让我装机装到吐血,经过两天的折腾终于弄明白怎么配置虚拟机的静态ip了. 方法: 1. 将虚拟机关机,--> 打开编辑 ->点击 虚拟网络映射 ->点击 VMne ...
- windows上mysql5.7服务启动报错
安装之后,启动服务 net start mysql,无法启动,日志报错缺少一些系统表,mysql.user等表 解决办法: bin目下执行:mysqld --initialize-insecure - ...
- 用 Java 训练出一只“不死鸟”
作者:Kingyu & Lanking FlappyBird 是 2013 年推出的一款手机游戏,因其简单的玩法但极度困难的设定迅速走红全网.随着深度学习(DL)与增强学习(RL)等前沿算法的 ...
- Core3.0中Swagger使用JWT
前言 学习ASP.NETCore,原链接 https://www.cnblogs.com/laozhang-is-phi/p/9511869.html 原教程是Core2.2,后期也升级到了Core3 ...
- Autofac官方文档翻译--一、注册组件--2传递注册参数
官方文档:http://docs.autofac.org/en/latest/register/parameters.html 二.Autofac 传递注册参数 当你注册组件时能够提供一组参数,可以在 ...
- 基于frp的内网穿透实例1-通过SSH访问内网机器
原文地址:https://wuter.cn/1804.html/ 老母鸡终于到了,作为一个能运行linux系统的四核1G硬件,它还是比较小巧的. FRP 全名:Fast Reverse Proxy.F ...
- 每日CSS_纯CSS制作进度条
每日CSS_纯CSS制作进度条 2020_12_26 源码 1. 代码解析 1.1 html 代码解析 设置整个容器 <div class="container"> . ...
- java 常用时间操作类,计算到期提醒,N年后,N月后的日期
package com.zjjerp.tool; import java.text.ParseException; import java.text.ParsePosition; import jav ...
- h5问题总结
一.下拉刷新上拉加载 主要依赖一款插件mescroll.js http://www.mescroll.com/ 简单好用.以前同事的用法是初始化执行执行上拉会调,页数从0开始,下拉重新加载当前地址走 ...
- Linux嵌入式学习-交叉编译mplayer
http://bbs.gkong.com/archive.aspx?ID=286721