2023-12-16:用go语言,给定整数数组arr,求删除任一元素后, 新数组中长度为k的子数组累加和的最大值。 来自字节。

news2024/12/23 12:57:08

2023-12-16:用go语言,给定整数数组arr,求删除任一元素后,

新数组中长度为k的子数组累加和的最大值。

来自字节。

答案2023-12-16:

来自左程云。

灵捷3.5

大体步骤如下:

算法 maxSum1 分析:

1.计算输入数组 arr 的长度 n。

2.如果 n <= k,则返回 0。

3.初始化 ans 为 int 类型的最小值(math.MinInt32)。

4.对于每个数组元素 arr[i],执行以下步骤:

4.a.删除第 i 个元素,得到新的数组 rest。

4.b.计算新数组 rest 的长度为 k 的子数组累加和的最大值,使用函数 lenKmaxSum(rest, k)。

4.c.将 ans 更新为 ans 和 lenKmaxSum(rest, k) 中的较大值。

5.返回 ans。

算法 delete 分析:

1.计算输入数组 arr 的长度 len0,即 len(arr) - 1。

2.创建一个长度为 len0 的新数组 ans。

3.初始化索引 i 为 0。

4.对于数组 arr 的每个元素 arr[j],执行以下步骤:

4.a.如果 j 不等于给定的索引 index,则将 arr[j] 赋值给 ans[i]。

4.b.将 i 递增 1。

5.返回新数组 ans。

算法 lenKmaxSum 分析:

1.计算输入数组 arr 的长度 n。
2.初始化 ans 为 int 类型的最小值(math.MinInt32)。
3.对于每个起始位置 i,从 i 到 i + (n - k) 执行以下步骤:
3.a.初始化 cur 为 0。
3.b.对于每个元素 arr[j],从 i 开始计数,执行以下步骤,直到计数 cnt 达到 k:
3.b. i.将 arr[j] 加到 cur 中。
3.b. ii.增加计数 cnt。
3.c.将 ans 更新为 ans 和 cur 中的较大值。
4.返回 ans。

算法 maxSum2 分析:

1.计算输入数组 arr 的长度 n。

2.如果 n <= k,则返回 0。

3.创建一个长度为 n 的窗口(window)数组。

4.初始化左指针 l 和右指针 r 为 0。

5.初始化变量 sum 为 0,并使用 int64 类型存储。

6.初始化 ans 为 int 类型的最小值(math.MinInt32)。

7.对于每个索引 i,从 0 到 n-1 执行以下步骤:

7.a.当窗口不为空且窗口中最后一个元素 arr[window[r-1]] 大于等于当前元素 arr[i] 时,移动右指针 r 减小窗口大小直至条件不满足。

7.b.将当前索引 i 添加到窗口中,即 window[r] = i,并递增右指针 r。

7.c.将当前元素 arr[i] 加到 sum 中。

7.d.如果 i >= k,说明窗口大小已达到 k,执行以下步骤:

7.d. i.将 ans 更新为 ans 和 sum 减去窗口左边界元素 arr[window[l]] 的较大值。

7.d. ii.如果窗口的左边界元素 arr[window[l]] 等于 i-k,说明该元素已经不在窗口内,移动左指针 l。

7.d. iii.从 sum 中减去窗口左边界元素 arr[i-k]。

8.返回 ans。

总的时间复杂度:

  • maxSum1 算法的时间复杂度为 O(n^2)。

  • delete 算法的时间复杂度为 O(n)。

  • lenKmaxSum 算法的时间复杂度为 O(n*k)。

  • maxSum2 算法的时间复杂度为 O(n)。

总的额外空间复杂度:

  • maxSum1 算法的额外空间复杂度为 O(n)。

  • delete 算法的额外空间复杂度为 O(n)。

  • lenKmaxSum 算法的额外空间复杂度为 O(1)。

  • maxSum2 算法的额外空间复杂度为 O(n)。

go完整代码如下:

package main

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

func maxSum1(arr []int, k int) int {
	n := len(arr)
	if n <= k {
		return 0
	}
	ans := math.MinInt32
	for i := 0; i < n; i++ {
		rest := delete(arr, i)
		ans = int(math.Max(float64(ans), float64(lenKmaxSum(rest, k))))
	}
	return ans
}

func delete(arr []int, index int) []int {
	len0 := len(arr) - 1
	ans := make([]int, len0)
	i := 0
	for j := 0; j < len(arr); j++ {
		if j != index {
			ans[i] = arr[j]
			i++
		}
	}
	return ans
}

func lenKmaxSum(arr []int, k int) int {
	n := len(arr)
	ans := math.MinInt32
	for i := 0; i <= n-k; i++ {
		cur := 0
		for j, cnt := i, 0; cnt < k; j, cnt = j+1, cnt+1 {
			cur += arr[j]
		}
		ans = int(math.Max(float64(ans), float64(cur)))
	}
	return ans
}

func maxSum2(arr []int, k int) int {
	n := len(arr)
	if n <= k {
		return 0
	}
	window := make([]int, n)
	l, r := 0, 0
	var sum int64 = 0
	ans := math.MinInt32
	for i := 0; i < n; i++ {
		for l < r && arr[window[r-1]] >= arr[i] {
			r--
		}
		window[r] = i
		r++
		sum += int64(arr[i])
		if i >= k {
			ans = int(math.Max(float64(ans), float64(sum-int64(arr[window[l]]))))
			if window[l] == i-k {
				l++
			}
			sum -= int64(arr[i-k])
		}
	}
	return ans
}

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

func main() {
	N := 100
	V := 1000
	testTimes := 10000
	fmt.Println("测试开始")
	rand.Seed(time.Now().Unix())
	for i := 0; i < testTimes; i++ {
		rand.Intn(N)
		n := rand.Intn(N) + 1
		arr := randomArray(n, V)
		k := rand.Intn(N) + 1
		ans1 := maxSum1(arr, k)
		ans2 := maxSum2(arr, k)
		if ans1 != ans2 {
			fmt.Println("出错了!")
		}
	}
	fmt.Println("测试结束")
}

在这里插入图片描述

c++完整代码如下:

#include <iostream>
#include <vector>
#include <cmath>
#include <cstdlib>
#include <ctime>

using namespace std;

int lenKmaxSum(const vector<int>& arr, int k);

int maxSum1(vector<int>& arr, int k) {
    int n = arr.size();
    if (n <= k) {
        return 0;
    }
    int ans = INT_MIN;
    for (int i = 0; i < n; i++) {
        vector<int> rest(arr.begin(), arr.end());
        rest.erase(rest.begin() + i);
        ans = max(ans, lenKmaxSum(rest, k));
    }
    return ans;
}

int lenKmaxSum(const vector<int>& arr, int k) {
    int n = arr.size();
    int ans = INT_MIN;
    for (int i = 0; i <= n - k; i++) {
        int cur = 0;
        for (int j = i, cnt = 0; cnt < k; j++, cnt++) {
            cur += arr[j];
        }
        ans = max(ans, cur);
    }
    return ans;
}

int maxSum2(const vector<int>& arr, int k) {
    int n = arr.size();
    if (n <= k) {
        return 0;
    }
    vector<int> window(n);
    int l = 0, r = 0;
    long long sum = 0;
    int ans = INT_MIN;
    for (int i = 0; i < n; i++) {
        while (l < r && arr[window[r - 1]] >= arr[i]) {
            r--;
        }
        window[r] = i;
        r++;
        sum += arr[i];
        if (i >= k) {
            ans = max(ans, static_cast<int>(sum - arr[window[l]]));
            if (window[l] == i - k) {
                l++;
            }
            sum -= arr[i - k];
        }
    }
    return ans;
}

void randomArray(vector<int>& arr, int n, int v) {
    arr.resize(n);
    for (int i = 0; i < n; i++) {
        arr[i] = rand() % (2 * v + 1) - v;
    }
}

int main() {
    const int N = 100;
    const int V = 1000;
    const int TEST_TIMES = 10000;
    cout << "测试开始" << endl;
    srand(time(NULL));
    for (int i = 0; i < TEST_TIMES; i++) {
        int n = rand() % N + 1;
        vector<int> arr;
        randomArray(arr, n, V);
        int k = rand() % N + 1;
        int ans1 = maxSum1(arr, k);
        int ans2 = maxSum2(arr, k);
        if (ans1 != ans2) {
            cout << "出错了!" << endl;
        }
    }
    cout << "测试结束" << endl;
    return 0;
}

在这里插入图片描述

c完整代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

#define int64_t long long

int64_t max0(int64_t a, int64_t b) {
    return (a > b) ? a : b;
}

int64_t lenKmaxSum(int64_t* arr, int64_t size, int64_t k);

int64_t maxSum1(int64_t* arr, int64_t size, int64_t k) {
    if (size <= k) {
        return 0;
    }
    int64_t ans = LLONG_MIN;
    for (int64_t i = 0; i < size; i++) {
        int64_t* rest = malloc((size - 1) * sizeof(int64_t));
        int64_t restIndex = 0;
        for (int64_t j = 0; j < size; j++) {
            if (j != i) {
                rest[restIndex] = arr[j];
                restIndex++;
            }
        }
        ans = max0(ans, lenKmaxSum(rest, size - 1, k));
        free(rest);
    }
    return ans;
}

int64_t lenKmaxSum(int64_t* arr, int64_t size, int64_t k) {
    int64_t ans = LLONG_MIN;
    for (int64_t i = 0; i <= size - k; i++) {
        int64_t cur = 0;
        for (int64_t j = i, cnt = 0; cnt < k; j++, cnt++) {
            cur += arr[j];
        }
        ans = max(ans, cur);
    }
    return ans;
}

int64_t maxSum2(int64_t* arr, int64_t size, int64_t k) {
    if (size <= k) {
        return 0;
    }
    int64_t* window = malloc(size * sizeof(int64_t));
    int64_t l = 0, r = 0;
    int64_t sum = 0;
    int64_t ans = LLONG_MIN;
    for (int64_t i = 0; i < size; i++) {
        while (l < r && arr[window[r - 1]] >= arr[i]) {
            r--;
        }
        window[r] = i;
        r++;
        sum += arr[i];
        if (i >= k) {
            ans = max0(ans, sum - arr[window[l]]);
            if (window[l] == i - k) {
                l++;
            }
            sum -= arr[i - k];
        }
    }
    free(window);
    return ans;
}

void randomArray(int64_t* arr, int64_t size, int64_t v) {
    for (int64_t i = 0; i < size; i++) {
        arr[i] = rand() % (2 * v + 1) - v;
    }
}

int main() {
    const int64_t N = 100;
    const int64_t V = 1000;
    const int64_t TEST_TIMES = 10000;
    printf("测试开始\n");
    srand(time(NULL));
    for (int64_t i = 0; i < TEST_TIMES; i++) {
        int64_t n = rand() % N + 1;
        int64_t* arr = malloc(n * sizeof(int64_t));
        randomArray(arr, n, V);
        int64_t k = rand() % N + 1;
        int64_t ans1 = maxSum1(arr, n, k);
        int64_t ans2 = maxSum2(arr, n, k);
        if (ans1 != ans2) {
            printf("出错了!\n");
        }
        free(arr);
    }
    printf("测试结束\n");
    return 0;
}

在这里插入图片描述

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

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

相关文章

12345、ABCDE项目符号列表文字视频怎么制作?重点内容介绍PR标题模板项目工程文件

Premiere模板&#xff0c;包含10个要点标题12345、ABCDE项目符号列表文字模板PR项目工程文件。可以根据自己的需要定制颜色。在视频的开头、中间和结尾使用。包括视频教程。 适用软件&#xff1a;Premiere Pro 2019 | 分辨率&#xff1a;19201080 (HD) | 文件大小&#xff1a;9…

金融众筹系统源码:适合创业孵化机构 附带完整的搭建教程

互联网技术的发展&#xff0c;金融众筹作为一种新型的融资方式&#xff0c;逐渐成为创业孵化机构的重要手段。为了满足这一需求&#xff0c;金融众筹系统源码就由此而生&#xff0c;并附带了完整的搭建教程。 以下是部分代码示例&#xff1a; 系统特色功能一览&#xff1a; 1.…

数据迁移测试经验分享

以下为作者观点&#xff1a; 数据迁移&#xff0c;是在保证新旧系统业务连续性的前提下&#xff0c;将数据从旧数据库迁移到新数据库的过程&#xff0c;测试前通过迁移策略和方案了解新旧系统数据如何重构与关联&#xff0c;测试过程需确保数据迁移的正确性&#xff0c;主要体…

《Linux C编程实战》笔记:一些系统调用

目录 dup和dup2函数 fcntl函数 示例程序1 示例程序2 ioctl函数 dup和dup2函数 #include <unistd.h> int dup(int oldfd); int dup2(int oldfd, int newfd): dup 函数复制 oldfd 参数所指向的文件描述符。 参数&#xff1a; oldfd&#xff1a;要复制的文件描述符的…

【TB作品】基于单片机的实验室管理系统,STM32,GM65二维码扫描模块

硬件&#xff1a; &#xff08;1&#xff09;STM32F103C8T6最小板&#xff08;&#xff09; &#xff08;2&#xff09;GM65二维码扫描模块 &#xff08;3&#xff09;DS1302实时时钟模块 &#xff08;4&#xff09;AT24C02 存储设备 &#xff08;5&#xff09;蜂鸣器 &#xf…

git 上传大文件操作 lfs 的使用

我们要先去下载 下载后安装 我最后还是下载到了D:\git\Git\bin这个目录下 如何检查是否下载成功呢&#xff0c;用 git lfs install 在命令行运行就可以查看 下面怎么上传文件呢 首先我们还是要初始化文件的 git init 下一步输入命令 git lfs install 下一步 git lfs tra…

初级数据结构(五)——树和二叉树的概念

文中代码源文件已上传&#xff1a;数据结构源码 <-上一篇 初级数据结构&#xff08;四&#xff09;——队列 | NULL 下一篇-> 1、树结构&#xff08;Tree&#xff09; 1.1、树结构的特点 自然界中的树由根部开始向上生长&#xff0c;随机长出分支&…

在Node.js中MongoDB查询分页的方法

本文主要介绍在Node.js中MongoDB查询分页的方法。 目录 Node.js中MongoDB查询分页使用原生的mongodb驱动程序查询分页使用Mongoose库进行查询分页注意项 Node.js中MongoDB查询分页 在Node.js中使用MongoDB进行查询分页&#xff0c;可以使用原生的mongodb驱动程序或者Mongoose库…

AtCoder ABC周赛2023 12/10 (Sun) D题题解

目录 原题截图&#xff1a; 题目大意&#xff1a; 主要思路&#xff1a; 注&#xff1a; 代码&#xff1a; 原题截图&#xff1a; 题目大意&#xff1a; 给定两个 的矩阵 和 。 你每次可以交换矩阵 的相邻两行中的所有元素或是交换两列中的所有元素。 请问要使 变换至…

LLaMA的解读与其微调:Alpaca-LoRA/Vicuna/BELLE/中文LLaMA/姜子牙/LLaMA 2

前言 近期&#xff0c;除了研究ChatGPT背后的各种技术细节 不断看论文(至少100篇&#xff0c;100篇目录见此&#xff1a;ChatGPT相关技术必读论文100篇)&#xff0c;还开始研究一系列开源模型(包括各自对应的模型架构、训练方法、训练数据、本地私有化部署、硬件配置要求、微调…

Ubuntu22.04添加用户

一、查看已存在的用户 cat /etc/passwd 二、添加用户 sudo adduser xxx 除了密码是必须的&#xff0c;其他的都可以不填&#xff0c;直接回车即可 三、查看添加的用户 cat /etc/passwd 四、将新用户添加到sudo组 sudo adduser xxx sudo 五、删除用户 sudo delus…

H5ke15--1--文本管理器拖进来

1如图1&#xff0c;父元素没有行高&#xff0c;子元素就不继承&#xff0c;有了就变成图2 2或者直接写表格自动垂直居中&#xff0c;但是table太古老了&#xff0c;没人用这个&#xff0c;如图3 3我们父元素display: table;展示位表格&#xff0c;子元素display: table-cell;…

HTML + JavaScript 实现网页录制音频与下载

HTML JavaScript 实现网页录制音频与下载 HTML JavaScript 实现网页录制音频与下载简介getUserMediaMediaRecorder获取和处理音频流实现音频的录制和播放音频效果的处理实时语音通话的应用兼容性和 Latency 问题 项目代码运行实例参考源码下载 HTML JavaScript 实现网页录制…

WEB渗透—PHP反序列化(三)

Web渗透—PHP反序列化 课程学习分享&#xff08;课程非本人制作&#xff0c;仅提供学习分享&#xff09; 靶场下载地址&#xff1a;GitHub - mcc0624/php_ser_Class: php反序列化靶场课程&#xff0c;基于课程制作的靶场 课程地址&#xff1a;PHP反序列化漏洞学习_哔哩…

dockerfile创建镜像 lNMP+wordpress

dockerfile创建镜像 lNMPwordpress nginx dockernginx mysql dockermysql php dockerphp nginx vim nginx.conf vim Dockerfile docker network create --subnet172.17.0.0/16 --opt "com.docker.network.bridge.name""docker1" mynetwork docker buil…

Redis设计与实现之对象处理机制

目录 一、前言 二、对象处理机制 1、redisObject 数据结构&#xff0c;以及 Redis 的数据类型 2、 命令的类型检查和多态 3、对象共享 4、引用计数以及对象的销毁 三、对象的处理 1、Redis是如何处理字符串对象的&#xff1f; 2、Redis是如何处理列表对象的&#xff1f…

Arduino中以太网Udp通信

目录 1、测试硬件 2、程序 &#xff08;0&#xff09;头文件添加 &#xff08;1&#xff09;变量定义 &#xff08;2&#xff09;初始化程序 &#xff08;3&#xff09;循环执行程序 3、程序下载 &#xff08;1&#xff09;开发板控制器和端口号选择 &#xff08;2&am…

java基础知识④:设计模式

目录 一、设计模式 1️⃣创建型设计模式&#xff08;常用&#xff1a;单例、工厂、抽象工厂&#xff09; 2️⃣结构型设计模式&#xff08;常用&#xff1a;适配器、装饰者、外观、代理&#xff09; 3️⃣行为型设计模式&#xff08;常用&#xff1a;观察者、策略、模板方法、命…

windows下redis 设置开机自启动

1&#xff0c;在redis的目录下执行&#xff08;执行后就作为windows服务了&#xff09; redis-server --service-install redis.windows.conf 2&#xff0c;安装好后需要手动启动redis redis-server --service-start 3&#xff0c;停止服务 redis-server --service-stop

springMVC 学习总结(四) 拦截器及统一异常处理

一.拦截器 1.拦截器与过滤器的区别 拦截器 Interceptor 和 过滤器 Filter类似&#xff0c;主要用于拦截用户请求并作出一定处理操作&#xff0c; 但两则也有不同之处&#xff0c;如过滤器只在Servlet前后起作用&#xff0c;是Servlet规范定义的&#xff0c;是Servlt容器才支…