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 ...
随机推荐
- 【Go语言绘图】图片的旋转
在上一篇中,我们了解了gg库的基本使用,包括调整大小.调整圆形参数.设置颜色.保存图片.加载图片和裁剪.这一篇我们来学习一下图片的旋转. 加载图片 首先,我们先来一张黄图. func TestRota ...
- mysql位函数的使用
查询每个月的访问天数 mysql> create table t1 (year YEAR(4),month int(2) unsigned zerofill,day int(2) u nsign ...
- Tomcat9没有service.bat
下载个Windows版本的才有service.bat,默认是不带的. 附上tomcat9的下载地址: https://archive.apache.org/dist/tomcat/tomcat-9/v ...
- yii\filters\AccessControl 访问权限控制
Class yii\filters\AccessControl 所有类 | 属性 | 方法 继承 yii\filters\AccessControl » yii\base\ActionFilter ...
- MySQL 5.6.38安装
#1.安装说明 本套安装方式适用于:CentOS6.X 或CentOS7.X系列的OS安装,此方法适用于MySQL5.6.xx版本的安装,如果是5.7版本的话不适合该配置. #2.准备安装环境 # N ...
- spring boot编程思想(核心篇) pdf 下载 it教程
资料简介:本书是<Spring Boot 编程思想>的核心篇,开篇总览Spring Boot核心特性,接着讨论自动装配(Auto-Configuration)与SpringApplicat ...
- 什么是可变参数?如何创建不可变集合?Steam三类方法是什么?获取流方法特点?流中间方法特点?终结流方法特点?
==知识梳理== ==重难点梳理== ==今日目标== 1.能够了解什么是可变参数 2.能够了解如何去创建不可变集合 3.能够掌握Stream流的使用 ==知识点== 1.可变参数 2.Stream流 ...
- IDEA使用SVN上传项目
文章最后附上svn服务器和客户端下载地址 一.IDEA集成SVN 二.查看SVN仓库 调出svn视图: 连接svn服务器: 连接后效果如下: 忽略上传文件 忽略文件如下:可以选择按规则匹配 .idea ...
- python-scrapy框架爬取某瓣电视剧信息--异步加载页面
前期准备,首先要有python环境+scrapy环境+pycharm环境 一.建立爬虫所需的环境,在命令行输入: scrapy startproject doubantv #命名自定义就好 会生成一个 ...
- Java中几种常见的循环
多重if_else: package com.dengchaoqun.ht; public class Double_For02 { /** * * 打印乘法表 */ public static vo ...