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

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;
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【strapi系列】strapi在postman中如何调试public和认证用户Authorization的接口

文章目录 一、public用户的调试二、认证用户的调试1、新建一个用户&#xff0c;用于获得token2、调用获取token的接口来获得token3、请求时携带token调用权限接口 三、参考链接 一、public用户的调试 对于public用户&#xff0c;如果是get请求&#xff0c;即使不在postman&…

【体系认证】ISO27701 隐私信息管理体系

1 认证定义 ISO/IEC 27701 隐私信息管理体系是ISO国际标准化组织和IEC国际电工委员会联合发布的隐私信息管理体系国际标准&#xff0c;它是对SO27001信息安全管理体系的扩展&#xff0c;在全球普遍受到认可&#xff0c;且具国际权威性。 ISO/IEC27701通过对隐私保护的控制对…

解决nginx和gateway网关跨域问题Access to XMLHttpRequest

一、为什么会出现跨域问题&#xff1f; 1、什么是跨域 跨域(Cross-Origin Resource Sharing,简称 CORS) 主要是浏览器的同源策略导致的。 同源策略要求浏览器发出的 AJAX 请求只能发给与请求页面域名相同的 API 服务器,如果发给其他域名就会产生跨域问题。 2、什么是同源策略&…

安全杂记 - js中的this关键字

javascript里什么是this this是js中的一个关键字&#xff0c;它是函数在运行时生成的一个内部对象&#xff0c;是属性和方法。 this就是属性或方法“当前”所在的对象&#xff0c;也就是调用函数的那个对象 this的使用场合 1.函数调用 <script>var a100;function test…

文件上传漏洞 -- uploadlabs为例

文件上传漏洞原理 一些web应用程序中允许上传图片、视频、头像和许多其他类型的文件到服务器中。 文件上传漏洞就是利用服务端代码对文件上传路径变量过滤不严格将可执行的文件上传到一个到服务器中 &#xff0c;再通过URL去访问以执行恶意代码。 非法用户可以利用上传的恶意脚…

机器学习深度学习——感知机

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——softmax回归的简洁实现 &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们…

前端面试题 —— React (二)

目录 一、React 组件中怎么做事件代理&#xff1f;它的原理是什么&#xff1f; 二、React.Component 和 React.PureComponent 的区别 三、Component, Element, Instance 之间有什么区别和联系&#xff1f; 四、React声明组件有哪几种方法&#xff0c;有什么不同&#xff1f…

OpenAI宣布安卓版ChatGPT正式上线;一站式 LLM底层技术原理入门指南

&#x1f989; AI新闻 &#x1f680; OpenAI宣布安卓版ChatGPT正式上线 摘要&#xff1a;OpenAI今日宣布&#xff0c;安卓版ChatGPT已正式上线&#xff0c;目前美国、印度、孟加拉国和巴西四国的安卓用户已可在谷歌Play商店下载&#xff0c;并计划在下周拓展到更多地区。Chat…

【每日运维】RockyLinux8非容器化安装Mysql、Redis、RabitMQ单机环境

系统版本&#xff1a;RockyLinux 8.6 安装方式&#xff1a;非容器化单机部署 安装版本&#xff1a;mysql 8.0.32 redis 6.2.11 rabbitmq 3.11.11 elasticsearch 6.7.1 前置条件&#xff1a;时间同步、关闭selinux、主机名、主机解析host 环境说明&#xff1a;PC电脑VMware Work…

【LeetCode】98.验证二叉搜索树

题目 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例 1&#xff1a…

OpenTelemetry框架

文章目录 1、分布式监控系统2、OpenTelemetry3、OpenTelemetry-Trace相关组件4、Context Propagation搭配HTTP Header传递信息5、Span相关 1、分布式监控系统 随着单体架构演变为微服务架构&#xff0c;线上问题的追踪和排查变的越来越困难&#xff0c;想解决这个问题就得实现…

【初阶C语言】认识和使用函数

1. 函数是什么 2. 库函数 3. 自定义函数 4. 函数参数 5. 函数调用 6. 函数的嵌套调用和链式访问 7. 函数的声明和定义 8. 函数递归 一、什么是函数 在数学中有函数&#xff0c;在C语言中也有函数&#xff0c;我们直接先给出一个定义&#xff1a; 在基维百科中函数被定义为子程…

【Datawhale夏令营】任务二学习笔记

目录 一&#xff1a;python语法回顾 1.1 print() 1.2 列表与字典 1.3自定义函数与return 1.4火车类&#xff08;面向对象&#xff09; 实例化总结&#xff1a; 二&#xff1a;LightGBM 代码精读 2.1导入库 2.2数据准备与参数设置 2.3时间特征函数 2.4优化 2.5训练与…

Microsoft todo 数据导出

文章目录 官方说明&#xff1a; https://support.microsoft.com/zh-cn/office/导出您的-microsoft-待办事项帐户-d286b243-affb-4db4-addc-162e16588943 由于 微软待办 会自动与 Outlook 中的任务同步&#xff0c;因此您可以从 Outlook 中导出所有列表和任务。 若要导出列表和…

类加载机制,类加载顺序

类加载顺序 ①类加载从上往下执行&#xff0c;依次执行静态的初始化语句和初始化块&#xff0c;而且类加载优先于对象创建。&#xff08;静态初始化语句和初始化块只加载一次&#xff09; ②创建本类的对象时&#xff0c;从上往下执行一次非静态的初始化语句和初始化块&#…

企业服务器数据库被360后缀勒索病毒攻击后采取的措施

近期&#xff0c;360后缀勒索病毒的攻击事件频发&#xff0c;造成很多企业的服务器数据库遭受严重损失。360后缀勒索病毒是Beijingcrypt勒索家族中的一种病毒&#xff0c;该病毒的加密形式较为复杂&#xff0c;目前网络上没有解密工具&#xff0c;只有通过专业的技术人员对其进…

LinuxC语言-网络通信tcp/ip errno获取错误描述字符串

目录 服务端代码&#xff1a; 获取errno错误码&#xff1a; 客户端代码&#xff1a; 运行结果: 服务端代码&#xff1a; #include <stdio.h> #include<sys/types.h> #include<sys/socket.h> #include<string.h> #include<netinet/in.h> #in…

2022.09.17【读书笔记】丨生物信息学与功能基因组学(第十三章 蛋白质结构预测 下)

目录 蛋白质结构预测三种方法同源建模(比较建模)穿线法从头预测&#xff08;ab initio&#xff09;基于假设推荐策略 精度与方法选择Alphafold2相关信息 蛋白质结构预测 三种方法 同源建模(比较建模) 建模4步骤 1.模板选择和确定折叠构象 通过blast或delta-blast搜索同源蛋白…

【spring】spring bean的生命周期

spring bean的生命周期 文章目录 spring bean的生命周期简介一、bean的创建阶段二、bean的初始化阶段三、bean的销毁阶段四、spring bean的生命周期总述 简介 本文测试并且介绍了spring中bean的生命周期&#xff0c;如果只想知道结果可以跳到最后一部分直接查看。 一、bean的…

centos7搭建k8s环境并部署springboot项目

之前看了很多文章&#xff0c;都是部署后一直报错&#xff0c;百度解决后下次又忘了&#xff0c;这次决定把从头到尾的过程记录下来方便下次再看&#xff0c;部署参考文章尚硅谷Kubernetes&#xff08;k8s&#xff09;视频学习笔记_尚硅谷k8s笔记_溯光旅者的博客-CSDN博客 1、…