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;
}
總結
以上是生活随笔為你收集整理的2023-12-16:用go语言,给定整数数组arr,求删除任一元素后, 新数组中长度为k的子数组累加和的最大值。 来自字节。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iPhone进水以后第一时间应该怎么做
- 下一篇: 探秘扫雷游戏的C语言实现