2022-01-05:有四种诗的韵律分别为: AABB、ABAB、ABBA、AAAA。
比如 : 1 1 3 3就属于AABB型的韵律、6 6 6 6就属于AAAA型的韵律等等,
一个数组arr,当然可以生成很多的子序列,如果某个子序列一直以韵律的方式连接起来,我们称这样的子序列是有效的。
比如, arr = { 1, 1, 15, 1, 34, 1, 2, 67, 3, 3, 2, 4, 15, 3, 17, 4, 3, 7, 52, 7, 81, 9, 9 },
arr的一个子序列为{1, 1, 1, 1, 2, 3, 3, 2, 4, 3, 4, 3, 7, 7, 9, 9},
其中1, 1, 1, 1是AAAA、2, 3, 3, 2是ABBA、4, 3, 4, 3是ABAB、7, 7, 9, 9是AABB,
可以看到,整个子序列一直以韵律的方式连接起来,所以这个子序列是有效的。
给定一个数组arr, 返回最长的有效子序列长度。
题目限制 : arr长度 <= 4000, arr中的值<= 10^9。
离散化之后,arr长度 <= 4000, arr中的值<= 4000。
来自小红书。

答案2022-01-05:

课堂有同学提出了贪心策略(这题还真是有贪心策略),是正确的
AABB
ABAB
ABBA
AAAA
先看前三个规则:AABB、ABAB、ABBA
首先A、A、B、B的全排列为:
AABB -> AABB
ABAB -> ABAB
ABBA -> ABBA
BBAA -> 等同于AABB,因为A和B谁在前、谁在后都算是 : AABB的范式
BABA -> 等同于ABAB,因为A和B谁在前、谁在后都算是 : ABAB的范式
BAAB -> 等同于ABBA,因为A和B谁在前、谁在后都算是 : ABBA的范式
也就是说,AABB、ABAB、ABBA这三个规则,可以这么用:
只要有两个不同的数,都出现2次,那么这一共4个数就一定符合韵律规则。
所以:

1.当来到arr中的一个数字num的时候,
如果num已经出现了2次了, 只要之前还有一个和num不同的数,
也出现了两次,则一定符合了某个规则, 长度直接+4,然后清空所有的统计

2.当来到arr中的一个数字num的时候,
如果num已经出现了4次了(规则四), 长度直接+4,然后清空所有的统计
但是如果我去掉某个规则,该贪心直接报废,比如韵律规则变成:
AABB、ABAB、AAAA
因为少了ABBA, 所以上面的化简不成立了, 得重新分析新规则下的贪心策略
而尝试的方法就更通用(也就是maxLen3),只是减少一个分支而已
这个贪心费了很多心思,值得点赞!

代码用golang编写。代码如下:

package main

import "fmt"

func main() {

    arr := []int{1, 1, 2, 2}
ret := maxLen4(arr)
fmt.Println(ret)
} func maxLen4(arr []int) int {
// 统计某个数(key),出现的次数(value)
map0 := make(map[int]int)
// tow代表目前有多少数出现了2次
two := 0
// ans代表目前符合韵律链接的子序列增长到了多长
ans := 0
// 当前的num出现了几次
numTimes := 0
for _, num := range arr {
// 对当前的num,做次数统计
map0[num]++
// 把num出现的次数拿出来
numTimes = map0[num]
// 如果num刚刚出现了2次, 那么目前出现了2次的数,的数量,需要增加1个
//two += numTimes == 2 ? 1 : 0;
if numTimes == 2 {
two += 1
}
// 下面的if代表 :
// 如果目前有2个数出现2次了,可以连接了
// 如果目前有1个数出现4次了,可以连接了
if two == 2 || numTimes == 4 {
ans += 4
//map.clear();
map0 = make(map[int]int)
two = 0
}
}
return ans
}

执行结果如下:


左神java代码

2022-01-05:有四种诗的韵律分别为: AABB、ABAB、ABBA、AAAA。 比如 : 1 1 3 3就属于AABB型的韵律、的更多相关文章

  1. LeetCode算法题-Minimum Distance Between BST Nodes(Java实现-四种解法)

    这是悦乐书的第314次更新,第335篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第183题(顺位题号是783).给定具有根节点值的二叉搜索树(BST),返回树中任何两个 ...

  2. LeetCode算法题-Third Maximum Number(Java实现-四种解法)

    这是悦乐书的第222次更新,第235篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第89题(顺位题号是414).给定非空的整数数组,返回此数组中的第三个最大数字.如果不存 ...

  3. LeetCode算法题-Valid Perfect Square(Java实现-四种解法)

    这是悦乐书的第209次更新,第221篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第77题(顺位题号是367).给定正整数num,写一个函数,如果num是一个完美的正方形 ...

  4. LeetCode算法题-Intersection of Two Arrays(Java实现-四种解法)

    这是悦乐书的第207次更新,第219篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第75题(顺位题号是349).给定两个数组,编写一个函数来计算它们的交集.例如: 输入: ...

  5. LeetCode算法题-Reverse Vowels of a String(Java实现-四种解法)

    这是悦乐书的第206次更新,第218篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第74题(顺位题号是345).编写一个函数,它将一个字符串作为输入,并仅反转一个字符串的 ...

  6. LeetCode算法题-Missing Number(Java实现-四种解法)

    这是悦乐书的第200次更新,第209篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第65题(顺位题号是268).给定一个包含n个不同数字的数组,取自0,1,2,...,n ...

  7. LeetCode算法题-Ugly Number(Java实现-四种解法)

    这是悦乐书的第199次更新,第208篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第64题(顺位题号是263).编写一个程序来检查给定的数字是否是一个丑陋的数字.丑陋的数 ...

  8. java面向对象中四种权限(private,protected,public,友好型)详解

    转自http://blog.csdn.net/a1237871112/article/details/50926975 及http://blog.csdn.net/blackmanren/articl ...

  9. PyCharm 中文教程 01:运行 Python 的四种方式

    <PyCharm 中文指南>在线阅读: http://pycharm.iswbm.com/ Github 项目主页: https://github.com/iswbm/pych... 1. ...

  10. C#播放声音的四种方法 +AxWindowsMediaPlayer的详细用法

    C#播放声音的四种方法 第一种是利用DirectX 1.安装了DirectX SDK(有9个DLL文件).这里我们只用到MicroSoft.DirectX.dll和 Microsoft.Directx ...

随机推荐

  1. mininet配置命令

    Mininet实验手册 一.安装 1.  直接使用带有完整软件的VM(略) 2.  源码安装 1)  下载 git clone git://github.com/mininet/mininet 2)  ...

  2. 看图就会-react条件渲染的5种方式

  3. 接口自动化之request几种常见请求及响应方法

    request 的几种常见方法 1.request.get() 发送get请求 2.request.post() 发送post请求 3.request.delete() 发送delete请求 4.re ...

  4. [HCTF 2018]WarmUp 1

    主页面是一个滑稽 得到source.php 观看源码,提示source.php 访问看到源码 <?php highlight_file(__FILE__); class emmm { publi ...

  5. docker搭建consul集群

    防止自己忘了,做个笔记. 环境为两台主机,ip分别为:  192.168.2.9,192.168.2.7 首先在  192.168.2.9 上执行一下命令: docker run -d --name ...

  6. 继续Vue的探索

    接上集 上次到了想要利用Vue实现隔行变色的请求,但是由于使用的代码过于"高级"导致无法识别,这就需要利用webpack来解决它! webpack的基本使用 1.首先,在项目中安装 ...

  7. 无法下载外网Docker镜像的解决方案

    概述 在安装k8s相关组件时经常会遇到需要下载一些外网的Docker镜像仓库,比如k8s的一个NFS存储类k8s.gcr.io/sig-storage/nfs-subdir-external-prov ...

  8. 一招教你 Notion 文章导出到公众号

    Notion是一个功能强大的笔记应用程序,有许多优点,包括: 用户友好的界面 跨平台支持 可以结构化组织笔记 多人协作 可以添加多种类型的媒体文件 可以添加评论和任务 这些优点使Notion成为一个广 ...

  9. 声网 MetaKTV 技术揭秘之“声临其境”:3D 空间音效+空气衰减+人声模糊

    声网近期发布了"MetaChat 元语聊"."MetaKTV"解决方案,致力于提供一种全新的元宇宙互动社交.K 歌方式,其中都提到了"3D 空间音频& ...

  10. Moebius兼容AlwaysOn

    背景 数据库是信息化的基石,支撑着整个业务系统,发挥着非常重要的作用,被喻为"IT的心脏".因此,让数据库安全.稳定.高效地运行已经成为IT管理者必须要面对的问题.数据库在底层架构 ...