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

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

  1. 给定一个double类型的数组arr,其中的元素可正可负可0,返回子数组累乘的最大乘积。例如arr=[-2.5,4,0,3,0.5,8,-1],子数组[3,0.5,8]累乘可以获得最大的乘积12,所以返回12。

    分析,是一个dp的题目, 设f[i]表示以i为结尾的最大值,g[i]表示以i结尾的最小值,那么 f[i+1] = max{f[i]*arr[i+1], g[i]*arr[i+1],arr[i+1]} ...

  2. GCD 莫比乌斯反演 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的 数对(x,y)有多少对.

    /** 题目:GCD 链接:https://vjudge.net/contest/178455#problem/E 题意:给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的 数对( ...

  3. 已知w是一个大于10但不大于1000000的无符号整数,若w是n(n≥2)位的整数,则求出w的后n-1位的数。

    描述 已知w是一个大于10但不大于1000000的无符号整数,若w是n(n≥2)位的整数,则求出w的后n-1位的数.   输入 第一行为M,表示测试数据组数.接下来M行,每行包含一个测试数据. 输出 ...

  4. C语言:找出一个大于给定整数m且紧随m的素数,-求出能整除x且不是偶数的数的个数,

    //函数fun功能:找出一个大于给定整数m且紧随m的素数,并作为函数值返回. #include <stdlib.h> #include <conio.h> #include & ...

  5. 12天学好C语言——记录我的C语言学习之路(Day 6)

    12天学好C语言--记录我的C语言学习之路 Day 6: 今天,我们要开始学习数组了. //①数组部分,数组的大小不能够动态定义.如下: //int n;   scanf("%d,& ...

  6. Python实现在给定整数序列中找到和为100的所有数字组合

    摘要:  使用Python在给定整数序列中找到和为100的所有数字组合.可以学习贪婪算法及递归技巧. 难度:  初级 问题 给定一个整数序列,要求将这些整数的和尽可能拼成 100. 比如 [17, 1 ...

  7. 【好书推荐】《剑指Offer》之硬技能(编程题12~16)

    本文例子完整源码地址:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/sword <[好书推荐]& ...

  8. 2023.1.16[模板]BSGS/exBSGS

    2023.1.16 [模板]BSGS/exBSGS 全称Boy Step Girl Step 给定一个质数 p,以及一个整数 a,一个整数 b,现在要求你计算一个最小的非负整数 l, 满足\(a^x ...

  9. mysql查询练习题-2016.12.16

    >>>>>>>>>> 练习时间:2016.12.16 编辑时间:2016-12-20-->22:12:08 题: 涉及:多表查询.ex ...

  10. 12天学好C语言——记录我的C语言学习之路(Day 12)

    12天学好C语言--记录我的C语言学习之路 Day 12: 进入最后一天的学习,用这样一个程序来综合考量指针和字符串的关系,写完这个程序,你对字符串和指针的理解应该就不错了. //输入一个字符串,内有 ...

随机推荐

  1. 全是中文的txt文件查找特定字符并输出该行到新文件

    tangshi.txt文件为全为汉唐诗 在该文件中查找指定字符 codecs库为打开中文文件的库,详情自行知乎 tangshi.txt大概十几万行,需要该文件练手的同学下方评论 要点:更改文件字符编码 ...

  2. PanGu-Coder2:从排序中学习,激发大模型潜力

    本文分享自华为云社区<PanGu-Coder2:从排序中学习,激发大模型潜力>,作者: 华为云软件分析Lab . 2022年7月,华为云PaaS技术创新Lab联合华为诺亚方舟语音语义实验室 ...

  3. Record -「CSP-S 2020」赛后总结

    其实这次的 CSP 暴露出来了很多问题. 比如策略上的,在 T1 花了太多的时间直接心态爆炸,后面的题只想着把暴力打满.看到 T2 只想着打暴力,根本没有沉下心来想,白白丢了一道(水)题. T3 连暴 ...

  4. mpi转以太网连接300PLC无需编程与1200PLC数据交换

    300PLC转以太网无需编程300PLC通过 NetDevice与1200PLC数据交换 应用概述: 兴达易控MPI转以太网模块MPI-ETH-XD1.0PLUS 通讯模块实现PLC无需编程通过简单的 ...

  5. 记一次 .NET 某拍摄监控软件 卡死分析

    一:背景 1. 讲故事 今天本来想写一篇 非托管泄露 的生产事故分析,但想着昨天就上了一篇非托管文章,连着写也没什么意思,换个口味吧,刚好前些天有位朋友也找到我,说他们的拍摄监控软件卡死了,让我帮忙分 ...

  6. P4899 [IOI2018] werewolf 狼人 题解

    P4899 [IOI2018] werewolf 狼人 题解 题目描述 省流: \(n\) 个点,\(m\) 条边,\(q\) 次询问,对于每一次询问,给定一个起点 \(S\) 和终点 \(T\) , ...

  7. Building Bridges 题解

    Building Bridges 题目大意 连接两根柱子 \(i,j\) 的代价是 \((h_i-h_j)^2+\sum\limits_{k=j+1}^{i-1}w_k\),连接具有传递性,求将 \( ...

  8. 虹科案例 | 丝芙兰xDomo:全球美妆巨头商业智能新玩法

    全球美妆行业的佼佼者丝芙兰,其走向成功绝非仅依靠品牌知名度和营销手段.身为数据驱动型企业,2018年以来,丝芙兰就率先在行业内采用虹科提供的Domo商业智能进行数据分析和决策,并首先享受了运营优化.效 ...

  9. 博弈论(Nim游戏 , 有向图游戏)

    博弈论专题 Nim游戏 内容: 有 n 堆石子,每堆石子的石子数给出,甲乙两人回合制取石子,每次可以取任意一堆石子的任意多个(可以直接取完,但不能不取),每个人都按照最优策略来取(抽象),问先手必胜或 ...

  10. exgcd|扩展欧几里得算法|扩展欧几里得算法证明|exgcd求逆元 一文说明白

    exgcd 扩展欧几里得算法(Extended Euclidean algorithm, EXGCD),常用于求 \(ax+by=\gcd(a,b)\) 的一组可行解. 部分选自OI Wiki 扩展欧 ...