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系统:红帽系统,LVM分区,Apache服务,MySQL服务,数据定时备份脚本
目录 一.项目目标 二.实施工具 三.项目实施计划 四.安装rhel7.5操作系统 4.1 配置虚拟机 4.2 安装操作系统 4.3 系统配置 4.3.1 网络配置 4.3.2 修改主机名 4.3.3 ...
- 01-flask-helloWorld
代码 from flask import Flask # 创建Flask对象 app = Flask(__name__) # 定义路由 @app.route('/') def index(): # 函 ...
- matplotlib的学习1-为什么学他
1.是一个非常强大的python画图的一个工具 2.手中有很多的数据,但是不知道如何呈现 matplotlib->能画出 线图; 散点图; 等高线图; 条形图; 柱状图; 3D 图形, 甚至是图 ...
- angular8 大地老师学习笔记---第九课
父组件:news组件 <app-header [title]="title" [msg]="msg" [run]='run' [home]='this'& ...
- MySQL数据归档小工具推荐--mysql_archiver
一.主要概述 MySQL数据库归档历史数据主要可以分为三种方式:一.创建编写SP.设置Event:二.通过dump导入导出:三.通过pt-archiver工具进行归档.第一种方式往往受限于同实例要求, ...
- 爬取并分析一下B站的最热视频排行榜,看看大家都喜欢看什么视频
前言 现在大家的生活中,已经越来越离不开B站了,2020年的第一季度,B站月活跃用户达到了1.72亿,日活跃用户也已经突破了5000万个用户.源源不断的流量让B站的up主们也是粉丝数目不断暴涨,百万粉 ...
- exp(cos(t)) - 2*cos(4.*t) + (sin(t./12)).^5;图形
clc; clear all; close all; t = linspace(0,24*pi,1000); r = exp(cos(t)) - 2*cos(4.*t) + (sin(t./12)). ...
- python之列表操作的几个函数
Python中的列表是可变的,这是它却别于元组和字符串最重要的特点,元组和字符串的元素不可修改.列举一些常用的列表操作的函数和方法. 1,list.append(x),将x追加到列表list末尾: 1 ...
- APP端有原生态的控件,但嵌入了H5页面,怎么定位到H5页面的元素
appium 通常有很多种定位元素方法,例如xpath,driver.find_element_by_accessibility_id等,安卓sdk自带的uiautomatorviewer但是对于H5 ...
- 同一个UITextField 根据不同状态下弹出不同类型键盘遇到的坑
一,需求:有多个选项按钮,点击不同的按钮,textfield内容需求不同弹出对应需求的键盘类型. 二,问题:1.刚开始在按钮状态改变后设置 self.textField.keyboardType属性完 ...