2023-07-27:最长可整合子数组的长度, 数组中的数字排序之后,相邻两数的差值是1, 这种数组就叫可整合数组。 给定一个数组,求最长可整合子数组的长度。

news2024/9/22 13:22:08

2023-07-27:最长可整合子数组的长度,

数组中的数字排序之后,相邻两数的差值是1,

这种数组就叫可整合数组。

给定一个数组,求最长可整合子数组的长度。

答案2023-07-27:

算法maxLen的过程如下:

1.检查输入数组是否为空,如果为空,则返回0,表示最长可整合子数组长度为0。

2.初始化长度为1的最长可整合子数组长度为ans。

3.创建一个空的set容器,用于记录数组中的元素是否已经存在。

4.开始遍历输入数组,从start = 0开始。每次迭代,重置set为空。

5.初始化minVal和maxVal为arr[start]。

6.将arr[start]添加到set中,表示该元素已经存在。

7.开始从start+1位置向后遍历数组,每次迭代的终止条件是end < len(arr)。

8.如果arr[end]在set中已经存在,表示遇到了重复元素,跳出循环。

9.将arr[end]添加到set中,表示该元素已经存在。

10.更新minVal和maxVal,如果arr[end]比minVal小,则更新minVal为arr[end];如果arr[end]比maxVal大,则更新maxVal为arr[end]。

11.检查当前子数组是否为可整合数组,即判断maxVal和minVal之间的差值是否等于end-start。

12.如果当前子数组为可整合数组,更新ans为当前子数组长度和ans中较大的值。

13.返回最长可整合子数组长度ans。

算法right的过程如下:

1.检查输入数组是否为空,如果为空,则返回0,表示最长可整合子数组长度为0。

2.初始化ans为0,用于记录最长可整合子数组的长度。

3.创建一个和输入数组相同长度的辅助数组help。

4.开始从左边界l开始遍历数组,每次迭代,右边界r从l开始向右遍历数组。

5.将arr[l:r+1]拷贝到辅助数组help的对应位置。

6.对help数组的切片help[l:r+1]进行排序,将切片中的元素按从小到大的顺序排列。

7.检查排序后的help数组是否符合可整合数组的条件,即判断help数组中相邻元素之间的差值是否为1。

8.如果help数组满足可整合数组条件,更新ans为当前子数组长度和ans中较大的值。

9.返回最长可整合子数组长度ans。

算法maxLen的时间复杂度和空间复杂度分别为:

时间复杂度:

  • 最坏情况下,需要遍历输入数组中的每个元素,所以时间复杂度为O(n),其中n是输入数组的长度。

空间复杂度:

  • 使用了一个set容器来存储元素,所以空间复杂度为O(n),其中n是输入数组的长度。

算法right的时间复杂度和空间复杂度分别为:

时间复杂度:

  • 最坏情况下,需要对每个子数组进行排序,对于长度为m的子数组,排序的时间复杂度为O(mlogm)。
  • 因此,整个算法的时间复杂度为O(n^2 log n),其中n是输入数组的长度。

空间复杂度:

  • 使用了一个辅助数组help存储子数组的拷贝,所以空间复杂度为O(n),其中n是输入数组的长度。

go完整代码如下:

package main

import (
    "fmt"
    "math"
    "math/rand"
    "sort"
)

func maxLen(arr []int) int {
    if arr == nil || len(arr) == 0 {
        return 0
    }
    ans := 1
    set := make(map[int]bool)
    for start := 0; start < len(arr); start++ {
        set = make(map[int]bool)
        minVal := arr[start]
        maxVal := arr[start]
        set[arr[start]] = true
        for end := start + 1; end < len(arr); end++ {
            if set[arr[end]] {
                break
            }
            set[arr[end]] = true
            if arr[end] < minVal {
                minVal = arr[end]
            }
            if arr[end] > maxVal {
                maxVal = arr[end]
            }
            if maxVal-minVal == end-start {
                ans = int(math.Max(float64(end-start+1), float64(ans)))
            }
        }
    }
    return ans
}

func right(arr []int) int {
    if arr == nil || len(arr) == 0 {
        return 0
    }
    n := len(arr)
    ans := 0
    help := make([]int, n)
    for l := 0; l < n; l++ {
        for r := l; r < n; r++ {
            copy(help[l:r+1], arr[l:r+1])
            sort.Ints(help[l : r+1])
            ok := true
            for i := l + 1; i <= r; i++ {
                if help[i-1]+1 != help[i] {
                    ok = false
                    break
                }
            }
            if ok {
                ans = int(math.Max(float64(ans), float64(r-l+1)))
            }
        }
    }
    return ans
}

func randomArray(n, v int) []int {
    arr := make([]int, n)
    for i := 0; i < n; i++ {
        arr[i] = rand.Intn(v) + 1
    }
    return arr
}

func main() {
    N := 100
    V := 50
    testTimes := 10000
    fmt.Println("测试开始")
    for i := 0; i < testTimes; i++ {
        n := rand.Intn(N)
        arr := randomArray(n, V)
        ans1 := maxLen(arr)
        ans2 := right(arr)
        if ans1 != ans2 {
            fmt.Println("出错了!")
        }
    }
    fmt.Println("测试结束")
}

在这里插入图片描述

c++完整代码如下:

#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_set>
using namespace std;

int maxLen(vector<int>& arr) {
    if (arr.empty()) {
        return 0;
    }
    int ans = 1;
    unordered_set<int> set;
    for (int start = 0; start < arr.size(); start++) {
        set.clear();
        int minVal = arr[start];
        int maxVal = arr[start];
        set.insert(arr[start]);
        for (int end = start + 1; end < arr.size(); end++) {
            if (set.find(arr[end]) != set.end()) {
                break;
            }
            set.insert(arr[end]);
            minVal = min(minVal, arr[end]);
            maxVal = max(maxVal, arr[end]);
            if (maxVal - minVal == end - start) {
                ans = max(ans, end - start + 1);
            }
        }
    }
    return ans;
}

int right(vector<int>& arr) {
    if (arr.empty()) {
        return 0;
    }
    int n = arr.size();
    int ans = 0;
    vector<int> help(n);
    for (int l = 0; l < n; l++) {
        for (int r = l; r < n; r++) {
            for (int i = l; i <= r; i++) {
                help[i] = arr[i];
            }
            sort(help.begin() + l, help.begin() + r + 1);
            bool ok = true;
            for (int i = l + 1; i <= r; i++) {
                if (help[i - 1] + 1 != help[i]) {
                    ok = false;
                    break;
                }
            }
            if (ok) {
                ans = max(ans, r - l + 1);
            }
        }
    }
    return ans;
}

vector<int> randomArray(int n, int v) {
    vector<int> ans(n);
    for (int i = 0; i < n; i++) {
        ans[i] = rand() % v + 1;
    }
    return ans;
}

int main() {
    int N = 100;
    int V = 50;
    int testTimes = 10000;
    cout << "测试开始" << endl;
    for (int i = 0; i < testTimes; i++) {
        int n = rand() % N;
        vector<int> arr = randomArray(n, V);
        int ans1 = maxLen(arr);
        int ans2 = right(arr);
        if (ans1 != ans2) {
            cout << "出错了!" << endl;
        }
    }
    cout << "测试结束" << endl;
    return 0;
}

在这里插入图片描述

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

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

相关文章

Java 队列

基本介绍 数组模拟队列 思路分析 代码实现 import java.util.Scanner;public class Test {public static void main(String[] args) {// 创建一个队列ArrayQueue queue new ArrayQueue(3);int select;Scanner scanner new Scanner(System.in);boolean loop true;while (lo…

【雕爷学编程】Arduino动手做(93)--- 0.96寸OLED液晶屏模块14

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

MySQL基础(四)数据库备份

目录 前言 一、概述 1.数据备份的重要性 2.造成数据丢失的原因 二、备份类型 &#xff08;一&#xff09;、物理与逻辑角度 1.物理备份 2.逻辑备份 &#xff08;二&#xff09;、数据库备份策略角度 1.完整备份 2.增量备份 三、常见的备份方法 四、备份&#xff08…

“嵌入式开发:多元化就业,职业发展广阔“

嵌入式开发是一个发展迅速、就业前景广阔的领域。在各行各业的电子产品中&#xff0c;嵌入式应用无处不在&#xff0c;为智能化提供关键支持。作为嵌入式工程师&#xff0c;你将有广泛的就业机会。 你可以涉足消费电子、安全安防、汽车电子、医疗电子、电信等多个行业的计算机…

SSIS对SQL Server向Mysql数据转发表数据 (完结)

1、对于根据主键进行更新和插入新的数据&#xff0c;根据前面的文章&#xff0c;对于组件已经很熟悉了&#xff0c;我们直接加入一个 查找 组件 &#xff0c;如下所示 2、右键点击"查找"&#xff0c;然后“编辑” &#xff0c;选择“连接”,选中我们的目标连接器&…

独立站最全出单营销指南,新手卖家赶紧学起来吧!

这是一个需要投入大量时间和精力的挑战&#xff0c;但只有经过筛选在众多品牌和渠道中找到最适合自己的营销策略&#xff0c;才能成功。 新手商家经常会发现自己有很多可以改进的地方&#xff1a;品牌的颜色、字体以及其他一些细节。但真正走向成熟的商家会意识到&#xff0c;…

cv2抛出异常 “install libgtk2.0-dev and pkg-config, then re-run cmake or configure”

背景&#xff1a; linux中使用cv2显示图片的时候&#xff0c;运行提示异常&#xff1a; 处理方式&#xff1a; 网友的推荐操作&#xff1a; 切换至root模式安装 apt-get install libgtk2.0-dev进入OpenCV下载目录&#xff0c;重新编译 cd /home/XXX/opencv mkdir release …

【图像处理】使用 OpenCV 将您的照片变成卡通

图像到卡通 一、说明 在当今世界&#xff0c;我们被图像和视频所包围。从社交媒体到广告&#xff0c;图像已成为一种强大的交流媒介。但是你有没有想过&#xff0c;如果你能把你的照片变成卡通会发生什么&#xff1f;想象一下&#xff0c;为您最喜欢的照片创建动画版本&#xf…

MOS管可以双向流过电流吗

在大多数MOS管电路中&#xff0c;对于NMOS管&#xff0c;电流方向一般是从漏极到源极&#xff0c;对于PMOS管&#xff0c;电流方向一般是从源极到漏极。 那么MOS管可以反向流过电流吗&#xff1f;也就是NMOS管电流从源极到漏极&#xff0c;PMOS管电流从漏极到源极。 为了弄清这…

【数据结构】实验九:二叉树

实验九 二叉树 一、实验目的与要求 1&#xff09;理解二叉树的类型定义&#xff1b; 2&#xff09;掌握二叉树的存储方式及基于存储结构的基本操作实现&#xff1b; 二、 实验内容 1. 二叉树的结点定义如下&#xff1a; struct TreeNode { int m_nvalue; TreeNode* m_…

常见内网穿透工具,收好了!

前言 本文以渗透的视角&#xff0c;总结几种个人常用的内网穿透&#xff0c;内网代理工具&#xff0c;介绍其简单原理和使用方法。 1. nps-npc 1.1 简介 nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发&#xff0c;可支持任何tcp、udp上层协…

解密 CryptBot 窃密软件

CryptBot 是一种针对 Windows 操作系统进行信息窃取的恶意软件&#xff0c;在 2019 年被首次发现。它旨在窃取失陷主机的敏感信息&#xff0c;例如浏览器凭据、加密货币钱包、浏览器 Cookie、信用卡信息与屏幕截图等。 恶意软件简介 沙盒动态分析 样本启动时会创建一个进程&…

什么是SD NAND存储芯片

前言 大家好&#xff0c;我们一般在STM32项目开发中或者在其他嵌入式开发中&#xff0c;经常会用到存储芯片存储数据。今天我和大家来介绍一款存储芯片&#xff0c;我这里采用&#xff08;雷龙&#xff09; CS创世 SD NAND 。 SD NAND介绍 什么是SD NAND&#xff1f;它俗称贴…

Linux安装部署Nacos和sentinel

1.将nacos安装包下载到本地后上传到linux中 2.进入nacos的/bin目录,输入命令启动nacos [rootlocalhost bin]# sh startup.sh -m standalone注:使用第二种方式启动,同时增加日志记录的功能 2.2 startup.sh文件是不具备足够的权限,否则不能操作 给文件赋予执行权限 [rootlocalh…

记录Selenium自动化测试过程中接口的调用信息

上一篇博客&#xff0c;我写了python自动化框架的一些知识和粗浅的看法&#xff0c;在上一篇中我也给自己提出一个需求&#xff1a;如果记录在测试过程中接口的调用情况&#xff1f;提出这个需求&#xff0c;我觉得是有意义的。你在测试过程中肯定会遇到一些莫名其妙的问题&…

怎样计算一个算法的复杂度?

分析一个算法主要看这个算法的执行需要多少机器资源。在各种机器资源中&#xff0c;时间和空间是两个最主要的方面。因此&#xff0c;在进行算法分析时&#xff0c;人们最关心的就是运行算法所要花费的时间和算法中使用的各种数据所占用的空间资源。算法所花费的时间通常称为时…

51单片机--红外遥控

文章目录 红外遥控的介绍硬件电路NEC编码外部中断红外遥控实例代码 红外遥控的介绍 红外遥控是一种无线、非接触控制技术&#xff0c;通过使用红外线来传送控制信号。它具有抗干扰能力强、信息传输可靠、功耗低、成本低、易实现等显著优点&#xff0c;因此被广泛应用于各种电子…

数据库的分库分表shell脚本

通过嵌套循环实现 #! /bin/bashback_user"-uroot -pRoot12345." back_dir/backup/one #获取数据库名 mysql ${back_user} -N -e show databases | grep -Ev sys|mysql|information_schema|performance_schema > dbswhile read dbname do[ -d ${back_dir}/$dbnam…

openEuler 22.03 LTS系统搭建局域网上网代理服务器

生产网环境的一个痛点就是与外网隔离&#xff0c;内网的服务器如果需要进行补丁升级或者下载更新软件&#xff0c;比较困难&#xff0c;本文讲解在生产网中能访问公网的openEuler 22.03 LTS系统服务器上搭建代理服务器&#xff0c;供内网其它服务器连接公网&#xff0c;同时介绍…

海尔设计借助亚马逊云科技生成式AI,实现端到端的云上工业设计解决方案

海尔创新设计中心&#xff08;以下简称海尔设计&#xff09;成立于1994年&#xff0c;目前拥有400多名设计师&#xff0c;为海尔智家旗下七大品牌全球的所有产品提供设计创新和模式探索。亚马逊云科技为海尔设计提供了四个完整的云上解决方案&#xff0c;全面替代自有机房&…