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

在这里插入图片描述

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

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

相关文章

QT----第三天,Visio stdio自定义封装控件,鼠标事件,定时器,事件分发器过滤器,绘图事件

目录 第三天1 自定义控件封装2 QT鼠标事件3 定时器4 event事件分发器5 事件过滤器6 绘图事件Qpainter 源码&#xff1a;CPP学习代码 第三天 1 自定义控件封装 新建一个QT widgetclass&#xff0c;同时生成ui,h,cpp文件 在smallWidget.ui里添加上你想要的控件并调试大小 回到…

day01-报表技术POI

前言 报表[forms for reporting to the higher organizations]&#xff0c;就是向上级报告情况的表格。简单的说&#xff1a;报表就是用表格、图表等格式来动态显示数据&#xff0c;可以用公式表示为&#xff1a;“报表 多样的格式 动态的数据”。 1、开发环境搭建 功能说…

【Python动漫系列】哆啦A梦(完整代码)

文章目录 哆啦A梦环境需求完整代码程序分析系列文章哆啦A梦 《哆啦A梦》是由日本漫画家藤子F不二雄创作的一部科幻搞笑漫画,故事中的主角是一只来自未来的机器猫——哆啦A梦。该作品于1969年开始连载,至今已经持续了50多年,成为了日本乃至全球最受欢迎的漫画之一。 故事发…

c++_01_名字空间_复合类型_缺省参数_哑元函数

0 前言 C和C一样&#xff0c;都属于编译型语言 C和C一样&#xff0c;都属于强类型语言 C对C完全兼容&#xff0c;并提供更多面向对象的特性&#xff1a;语言风格更加简洁&#xff0c;类型检查更加严格 1 名字空间 namespace WHY&#xff1f;划分更精细的逻辑单元(逻辑空间)&…

AC843. n皇后问题--60

我们只需要把蓝色的往上移动就行了 if(!col[i][j]&&!dg[ui]&&!udg[])//1y&#xff08;i&#xff09;向下&#xff0c;x&#xff08;u&#xff09;向右为正。yxb的by-x一定>0,y-xb的bxy可能>0,这个不考虑&#xff0c;只看-bxy.

Python-数据分析可视化实例图

Python-数据分析可视化实例图 一&#xff1a;3D纹理图 运行效果图&#xff1a; Python代码&#xff1a; import math from typing import Unionimport pyecharts.options as opts from pyecharts.charts import Surface3Ddef float_range(start: int, end: int, step: Union[…

翻译: 工作使用ChatGPT的例子 Day-to-day usage of web UI LLMs

本周&#xff0c;我们将首先探讨生成型AI在商业中的作用&#xff0c;然后是其对社会的影响&#xff0c;例如对就业的影响。我们将从探讨如何在日常工作中使用网络用户界面访问生成型AI开始&#xff0c;然后再看看如何系统地分析一个企业&#xff0c;以识别使用生成型AI增强或自…

Linux面试题精选:提升你的面试准备

大家有关于JavaScript知识点不知道可以去 &#x1f389;博客主页&#xff1a;阿猫的故乡 &#x1f389;系列专栏&#xff1a;JavaScript专题栏 &#x1f389;ajax专栏&#xff1a;ajax知识点 &#x1f389;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 学习…

商用机器人,不好用是原罪

热潮褪去后&#xff0c;所有的问题都汇总成一个词&#xff0c;不好用。 从炙手可热到“大玩具” 一款产品好用与否&#xff0c;更多时候人们不会关心它先进的技术、工艺、用料&#xff0c;也不会考虑所谓的潮流趋势或前景&#xff0c;只会用最朴素的直观感受告诉你&#xff0…

LabVIEW开发地铁运行安全监控系统

LabVIEW开发地铁运行安全监控系统 最近昌平线发生的故障事件引起了广泛关注&#xff0c;暴露了现有地铁运行监控系统在应对突发情况方面的不足。为了提高地铁系统的运行安全性&#xff0c;并防止类似事件再次发生&#xff0c;提出了一套全面的地铁运行安全监控系统方案。此方案…

NAT——网络地址转换

目录 一、概念 二、NAT的分类 1.静态NAT 1.1 静态NAT的配置 1.2 利用eNSP小实验加强对静态NAT的理解 2、动态NAT 三、NAPT——端口映射 四、Easy IP 使用一个公网地址可以让所有人都上公网 一、概念 随着Internet的发展和网络应用的增多&#xff0c;IPv4地址枯竭已经成为…

【C语言(十)】

字符函数和字符串函数 一、字符分类函数 C语言中有⼀系列的函数是专门做字符分类的&#xff0c;也就是⼀个字符是属于什么类型的字符的。这些函数的使用都需要包含⼀个头文件是 ctype.h 这些函数的使用方法非常类似&#xff0c;我们就讲解⼀个函数的事情&#xff0c;其他的非…

鸿蒙4.0开发 - DevEco Studio如何使用Previewer窗口预览器报错

DevEco Studio预览器概况在HarmonyOS应用开发过程中&#xff0c;通过使用预览器&#xff0c;可以查看应用的UI效果&#xff0c;方便开发者实时查看应用的运行效果&#xff0c;随时调整代码。 1.正常启动 打开预览器的位置在DevEco Studio编辑界面的右上角部分&#xff0c;竖排…

MySQL低版本中:字符串中的数字、英文字符、汉字提取

我们如何提醒一个字段中的汉字和数字呢 高版本指mysql8.0以上 使用sql语句 SELECT REGEXP_REPLACE(column_name, [^\\p{Han}], ) AS chinese_characters FROM table_name;其中 column_name指名称列&#xff0c;table_name是表名 2.低版本使用 需要新建函数 DELIMITER $$DR…

ChatGPT4 Excel 高级复杂函数案例实践

案例需求: 需求中需要判断多个条件进行操作。 可以让ChatGPT来实现这样的操作。 Prompt:有一个表格B2单元格为入职日期,C2单元格为员工等级(A,B,C),D2单元格为满意度分数(1,2,3,4,5)请给入职一年以上,员工等级为A级并且满意度在3分以上的人发4000元奖金,给入…

《打造第二大脑》—如何构建高效的笔记系统

最近看了一本书&#xff0c;因为我也用Obsidian来记笔记&#xff0c;&#xff08;Obsidian之前有介绍过Obsidian使用教程&#xff08;如何构建你的个人知识库&#xff0c;第二大脑&#xff09;&#xff09;看完这本书后发现里面给的方法跟Obsidian很契合&#xff0c;所以就整理…

Vue3报错: ‘defineProps‘ is not defined,解决方法

问题出现: 今天在使用 <script setup>组合式 API 的语法糖的时候&#xff0c;定义defineProps时候报错&#xff1a; ‘defineProps’ is not defined 查了一下资料&#xff0c;这是因为eslint的语法校验导致的问题。 解决方法1&#xff1a; 在项目根目录的文件.eslin…

基于Springboot的任务发布平台设计与实现(源码齐全+调试)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。你想解决的问题&#xff0c;今天给大家介绍…

QT作业3

完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&#xf…

鸿蒙小车之多任务调度实验

说到鸿蒙我们都会想到华为mate60&#xff1a;遥遥领先&#xff01;我们一直领先&#xff01; 我们这个小车也是采用的是鸿蒙操作系统&#xff0c;学习鸿蒙小车&#xff0c;让你遥遥领先于你的同学。 文章目录 前言一、什么是任务&#xff1f;为什么要有任务二、任务的状态三、任…