【LeetCode】932. 漂亮数组

news2024/11/27 14:33:22

932. 漂亮数组(中等)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

解法一:分治法

重点

这里给出两个定理:

  • 如果 X,Y,Z 是漂亮数组,则 k * X + b, k * Y + b, k * Z + b 一定也是漂亮数组;
  • 奇数 + 偶数 = 奇数。

因此不难证明,如果 2 * Y ≠ X + Z, 则 2 * k * Y + b ≠ k * X + b + k * Z + b 一定成立。

思路

对于一个正整数 N ,我们寻找中点将其等分成两部分 ,left 和 right ,如果 left 和 right 都是漂亮数组,同时 left 部分全部是奇数 , right 部分全部是偶数 ,那么left + right 组成的数组一定也是漂亮数组

因此,可以采用分治算法,自顶向下逐步分解,先找到 N 的中点,通过 (N+1)/2N/2 将数组分成左右两部分。其中,奇数全部放在 left ,偶数全部放在 right ,同时保证 left 和 right 都是漂亮数组,然后一步一步进行分解。

直到 N = 1 时,数组中只有一个元素 [1] ,不需要再进行分解。

接下来,我们从底层部分考虑合并。如果我们知道了整数 N 的漂亮数组,那么可以通过 k * N + b 的变换使得 N 变为 2N 的奇数部分(left) ,同样地,可以通过变换使得 N 变为 2N 的偶数部分(right)。

下面的图展示了一个完整的分析过程。

  • 首先自顶向下进行考虑,找到 N 的中点,通过 (N+1)/2N/2 不断将数组分成左右两部分 ;
  • 直到 N = 1,我们可以返回 N = 1 的漂亮数组为 [1]
  • 最后考虑自底向上的合并 ,即对 left 中的每一个元素进行 left[i] * 2 -1 ,得到更高一级数组的左半部分,对 right 中的每一个元素进行 right[i] * 2 ,得到更高一级数组的右半部分。

在这里插入图片描述

代码

class Solution {
public:
    vector<int> beautifulArray(int n) {
        // if(n == 1) return {[1]};
        vector<int> ans, left, right;
        if(n > 1){
            left = beautifulArray((n+1)/2);
            right = beautifulArray(n/2);
            for(int l : left){
                ans.push_back(l * 2 - 1);
            }
            for(int r : right){
                ans.push_back(r * 2);
            }
        }
        else ans.push_back(1);
        return ans;
    }
};

解法二:分治法 + 记忆化搜索

以 N = 10 为例,第一步是分解成 N = 5 和 N = 5 两部分,如果按照解法一,需要计算两次 N = 5 的漂亮数组。显然产生了重复计算,因此我们可以在第一次计算出 N = 5 的漂亮数组时,使用 mp 将答案保存下来,第二次遍历时只需要在 mp 查找即可,减少了时间复杂度。

代码

class Solution {
public:
    unordered_map<int, vector<int>> mp;
    vector<int> beautifulArray(int n) {
        // 判断n是否已经计算过
        if(mp.find(n) != mp.end()){
            return mp.find(n) -> second;
        }
        vector<int> ans, left, right;
        if(n > 1){
            left = beautifulArray((n+1)/2);
            right = beautifulArray(n/2);
            for(int l : left){
                ans.push_back(l * 2 - 1);
            }
            for(int r : right){
                ans.push_back(r * 2);
            }
        }
        else ans.push_back(1);
        mp[n] = ans;
        return ans;
    }
};

解法三:动态规划

其实弄明白解法一之后,动态规划的思路就变得很简单。

动态规划的思想,就等同于「分治法」中的合并,即自底向上的考虑。

我们从 N = 1 的漂亮数组开始,找到 N = 2 的漂亮数组,找到 N = 3 的漂亮数组…直到计算出 N = n 的漂亮数组。

状态定义

因此,我们很容易就能完成状态定义,令 dp[i] 表示长度为 i 的漂亮数组。

状态转移方程

我们通过解法一的分析图不难发现,dp[i] 由两部分组成:2 * dp[(i+1)/2] - 1dp[i/2] * 2 ,因此遍历 dp[(i+1)/2]dp[i/2] ,并对它们的元素做相应变换,依次存入 dp[i] 即可。

初始化

我们令 dp[1] = {1} , N = 2 的漂亮数组可以由 N = 1 变换得到。

返回的最终结果

最终返回 dp[n] , 表示 N = n 的漂亮数组。

代码

class Solution {
public:
    unordered_map<int, vector<int>> mp;
    vector<int> beautifulArray(int n) {
        vector<vector<int>> dp(n+1);
        
        // 初始化
        dp[1].push_back(1);

        // 状态转移
        for(int i=2; i<=n; ++i){
            for(int l : dp[(i+1)/2]){
                dp[i].push_back(l * 2 - 1);
            }
            for(int r : dp[i/2]){
                dp[i].push_back(r * 2);
            }
        }
        return dp[n];
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/513178.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue+elementui写了一个图书管理系统

用vueelementui写了一个图书管理系统 转载自公号&#xff1a;java大师 目前是指一个纯前端的展示&#xff0c;后端还在开发中&#xff0c;前端接口是通过json-server模拟的 用到的技术栈 1、vue.js 2、elementui 3、json-server 4、axios 5、vue-router 动态路由 目录结构…

Java每日一练(20230511) 有效数字、重复元素II、类和子类

目录 1. 有效数字 &#x1f31f;&#x1f31f;&#x1f31f; 2. 存在重复元素 II &#x1f31f;&#x1f31f; 3. 设计学生类Student和它的一个子类Undergraduate &#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专…

基于postgresql传统数据仓库搭建

目录 概述数仓选型对比当前数仓架构问题解决方案 架构设计数据仓库设计命名规范模型设计 PostgreSQL的安装数据仓库的建立创建数据库创建用户组创建用户用户加入到用户组创建模式模式授权用户收回函数的执行权限公开表的select权限动态sql函数集中处理函数 fdw实现数据抽取安装…

ChatGPT与Discord无缝接入指南,获取你的专属聊天机器人

ChatGPT与Discord无缝接入指南,获取你的专属聊天机器人 一、获取OpenAI API密钥。二、获取Discord Token三、注册GitHub,有账号的可以直接登录。四、在线开发环境搭建Replit五、注册cron-job.org本教程收集于: AIGC从入门到精通教程 ChatGPT和Discord都非常流行,而在Disco…

基于RK3588s人工智能大算力多网口工业网关交换机,可接5路千兆高清相机

RK3588/RK3588S AI BOX 功能接口说明 接口需求 功能定义与要求 备注 成本与目标 硬件设计争取全国产化&#xff0c; 632GB 版本 RK3588S PCBA 尺寸 146*102 丝印版本号 RK3588S AI BOX V1.0 EMMC 支持 SanDisk SDINBDA4-32/64/128G 4G-8GB 标配 8GB …

tensorboard如何使用

神经网络本身比较难理解&#xff0c;看起来很神秘&#xff0c;所以我们可以借助可视化根据tensorboard关注神经网络的运行过程&#xff0c;其中包括了各项数据指标以及神经网络自身的图结构。 TensorBoard 是 TensorFlow 的可视化工具&#xff0c;可以帮助用户更好地理解和调试…

【Linux】项目自动化构建工具make/makefile

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;Linux的学习之路 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录 前言一、make/makefile的背景二、…

00后卷起来,真没我们老油条什么事了···

都说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。 这不&#xff0c;前段时间我们公司来了个00后&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪20K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。…

Android 中你碰不到但是很重要的类之ActivityThread

作者&#xff1a;Drummor 通过本文能了解一下内容 1、和系统进程打交道的桥头堡 应用进程起来之后ART(Android Runtime)第一站就是ActivityThread&#xff0c;代码层面上就是ActivityThread的main()方法&#xff0c;是不是很熟悉&#xff0c;爷青回啊&#xff0c;这不就是java…

基于深度学习的动物识别系统的实现

项目介绍 动物识别系统&#xff0c;使用Python作为主要开发语言&#xff0c;基于深度学习TensorFlow框架&#xff0c;搭建卷积神经网络算法。并通过对18种动物数据集进行训练&#xff0c;最后得到一个识别精度较高的模型。并基于Django框架&#xff0c;开发网页端操作平台&…

数据分析师 ---- SQL强化(3)

数据分析师 ---- SQL强化(3) 题目&#xff1a;每个月Top3的周杰伦歌曲 从听歌流水中找到18-25岁用户在2022年每个月播放次数top 3的周杰伦的歌曲 输入例子&#xff1a; drop table if exists play_log; create table play_log (fdate date,user_id int,song_id int ); inser…

前端的培训计划书

文章目录 导文模板一一、前言二、培训目标三、培训内容和计划 模板二模板三 导文 这里是导文 模板一 一、前言 随着互联网的快速发展&#xff0c;前端开发已经成为了现代软件开发中一个不可或缺的重要技能。本次培训旨在帮助学员快速掌握前端开发的核心知识和技能&#xff0c…

ChatGPT实现撰写邮件

撰写邮件 电子邮件是日常工作中很常用的工具&#xff0c;在相对正式的场合&#xff0c;一封格式美观、用语典雅的电子邮件正文会起到很好的作用。ChatGPT 可以较好的完成电子邮件的编写和格式美化工作。 下面让我们以产品销售的角度&#xff0c;写一封推销邮件。假定产品名称…

String类 [中]

目录 一、 string 的深浅拷贝 0x00 构造函数与析构函数的实现 0x01 拷贝构造 0x02 赋值 0x03 整体代码 二、 string的实现 0x01 引入 0x02 c_str 0x03 默认构造函数 三、size()与operator[]的实现 0x01 size()的实现 0x02 operator[]的实现 0x03 遍历实现 四、迭代器…

洛谷B2098 整数去重

整数去重 题目描述 给定含有 n n n 个整数的序列&#xff0c;要求对这个序列进行去重操作。所谓去重&#xff0c;是指对这个序列中每个重复出现的数&#xff0c;只保留该数第一次出现的位置&#xff0c;删除其余位置。 输入格式 输入包含两行&#xff1a; 第一行包含一个…

获取两个日期间时长 (XX天XX时XX分)

使用场景&#xff1a; 发货日期与到货日期 计算运输时长 代码&#xff1a; private String getMinuteTime(String startTime, String endTime) {String minuteTime null;if (StrUtil.isNotBlank(startTime) && StrUtil.isNotBlank(endTime)) {long minute DateUti…

【芯片设计- RTL 数字逻辑设计入门 2 - vcs 及 verdi 使用介绍】

文章目录 1.1 VCS 编译环境1.1.1 Complie Design1.1.2 simv 仿真 1.2 VCS 波形生成及查看1.2.1 verdi 命令介绍1.2.2 verdi 波形查看 1.1 VCS 编译环境 VCS 全称是 Verilog Compiler Simulator&#xff0c;是 Synopsys 公司的&#xff0c;类似于windows环境下的 questasim 或 …

Flink sql

1.创建表的执行环境 第一种 StreamExecutionEnvironment env StreamExecutionEnvironment.getExecutionEnvironment(); env.setParallelism(1); SingleOutputStreamOperator<Event> streamOperator env.addSource(new ClickSource()).assignTimestampsAndWatermarks(W…

深入理解C语言指针

目录 一、指针基础知识 二、野指针 三、指针运算 四、二级指针 五、指针数组与数组指针 六、函数指针与函数指针数组 一、指针基础知识 什么是指针&#xff1f; 指针其实就是个用来存放地址的变量&#xff0c;定义为type *。 指针大小&#xff1f; 32位平台(32个地…

【大数据-调度工具】dolphinscheduler安装和遇到的问题

1.安装 安装步骤按照官网安装即可 官网&#xff1a;DolphinScheduler | 文档中心 (apache.org) 版本&#xff1a;3.1.5 2.踩坑记录 Q1.大文件无法上传 问题描述&#xff1a; 在资源中心中上传文件选择完大文件夹之后&#xff0c;选择确认之后确认按钮转了几圈圈之后就没…