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

本文主要是介绍2023-12-16:用go语言,给定整数数组arr,求删除任一元素后, 新数组中长度为k的子数组累加和的最大值。 来自字节。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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 mainimport ("fmt""math""math/rand""time"
)func maxSum1(arr []int, k int) int {n := len(arr)if n <= k {return 0}ans := math.MinInt32for 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) - 1ans := make([]int, len0)i := 0for 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.MinInt32for i := 0; i <= n-k; i++ {cur := 0for 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, 0var sum int64 = 0ans := math.MinInt32for i := 0; i < n; i++ {for l < r && arr[window[r-1]] >= arr[i] {r--}window[r] = ir++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 := 100V := 1000testTimes := 10000fmt.Println("测试开始")rand.Seed(time.Now().Unix())for i := 0; i < testTimes; i++ {rand.Intn(N)n := rand.Intn(N) + 1arr := randomArray(n, V)k := rand.Intn(N) + 1ans1 := 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 longint64_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;
}

在这里插入图片描述

这篇关于2023-12-16:用go语言,给定整数数组arr,求删除任一元素后, 新数组中长度为k的子数组累加和的最大值。 来自字节。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/503644

相关文章

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

go中的时间处理过程

《go中的时间处理过程》:本文主要介绍go中的时间处理过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 获取当前时间2 获取当前时间戳3 获取当前时间的字符串格式4 相互转化4.1 时间戳转时间字符串 (int64 > string)4.2 时间字符串转时间

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

Mysql实现范围分区表(新增、删除、重组、查看)

《Mysql实现范围分区表(新增、删除、重组、查看)》MySQL分区表的四种类型(范围、哈希、列表、键值),主要介绍了范围分区的创建、查询、添加、删除及重组织操作,具有一定的参考价值,感兴趣的可以了解... 目录一、mysql分区表分类二、范围分区(Range Partitioning1、新建分区表:2、分

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优