首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

2024-01-03:用go语言,给你两个长度为 n 下标从 0 开始的整数数组 cost 和 time, 分别表示给 n 堵不

2024-01-03:用go语言,给你两个长度为 n 下标从 0 开始的整数数组 cost 和 time,

分别表示给 n 堵不同的墙刷油漆需要的开销和时间。你有两名油漆匠,

一位需要 付费 的油漆匠,刷第 i 堵墙需要花费 time[i] 单位的时间,

开销为 cost[i] 单位的钱。

一位 免费 的油漆匠,刷 任意 一堵墙的时间为 1 单位,开销为 0,

但是必须在付费油漆匠 工作 时,免费油漆匠才会工作。

请你返回刷完 n 堵墙最少开销为多少?

输入:cost = [1,2,3,2], time = [1,2,3,2]。

输出:3。

来自力扣。2742. 给墙壁刷油漆。

答案2024-01-03:

来自左程云。

灵捷3.5

大体过程如下:

paintWalls1?函数

1.paintWalls1函数是基于递归方法的解决方案。

2.在process1函数中,通过递归方式将每种情况下的最小开销计算出来。

3.递归调用时考虑两种情况,选择当前墙刷或者不刷,计算出最小开销。

4.该方法在递归调用的过程中可能会有很多重复计算,效率可能不高。

paintWalls2?函数

1.paintWalls2函数采用了记忆化搜索的方式。

2.定义了一个二维数组dp用于记录已经计算过的结果,避免重复计算。

3.通过递归+记忆化搜索的方式优化了重复计算,提高了效率。

paintWalls3?函数

1.paintWalls3函数采用了动态规划的方式。

2.使用一个一维数组dp保存不同墙数下的最小开销。

3.结合循环和动态递推的方式,迭代计算每墙的最小开销,直到第 n 墙。

时间和空间复杂度

??时间复杂度:

?paintWalls1使用了递归,可能有大量重复计算,其时间复杂度为 O(2^n)。

?paintWalls2和paintWalls3使用了记忆化搜索和动态规划,时间复杂度都为 O(n^2),其中 n 为墙的数量。

??空间复杂度:

?paintWalls1和paintWalls2的额外空间复杂度为 O(n^2),因为它们都使用了二维数组存储中间结果。

?paintWalls3的额外空间复杂度为 O(n),因为它只用了一个一维数组保存中间结果。

go完整代码如下:

package?main

import?(

"fmt"

"math"

)

//?paintWalls1?represents?the?first?function?from?the?given?Java?code.

func?paintWalls1(cost?[]int,?time?[]int)?int?{

return?process1(cost,?time,?0,?len(cost))

}

//?process1?is?the?recursive?function?as?mentioned?in?the?Java?code.

func?process1(cost?[]int,?time?[]int,?i?int,?s?int)?int?{

if?s?<=?0?{

return?0

}

//?s?>?0

if?i?==?len(cost)?{

return?math.MaxInt32

}?else?{

p1?:=?process1(cost,?time,?i+1,?s)

p2?:=?math.MaxInt32

next2?:=?process1(cost,?time,?i+1,?s-1-time[i])

if?next2?!=?math.MaxInt32?{

p2?=?cost[i]?+?next2

}

return?int(math.Min(float64(p1),?float64(p2)))

}

}

//?paintWalls2?is?the?second?function?from?the?given?Java?code.

func?paintWalls2(cost?[]int,?time?[]int)?int?{

n?:=?len(cost)

dp?:=?make([][]int,?n+1)

for?i?:=?range?dp?{

dp[i]?=?make([]int,?n+1)

for?j?:=?range?dp[i]?{

dp[i][j]?=?-1

}

}

return?process2(cost,?time,?0,?n,?dp)

}

//?process2?represents?the?recursive?function?in?the?second?approach?of?the?Java?code.

func?process2(cost?[]int,?time?[]int,?i?int,?s?int,?dp?[][]int)?int?{

if?s?<=?0?{

return?0

}

if?dp[i][s]?!=?-1?{

return?dp[i][s]

}

var?ans?int

if?i?==?len(cost)?{

ans?=?math.MaxInt32

}?else?{

p1?:=?process2(cost,?time,?i+1,?s,?dp)

p2?:=?math.MaxInt32

next2?:=?process2(cost,?time,?i+1,?s-1-time[i],?dp)

if?next2?!=?math.MaxInt32?{

p2?=?cost[i]?+?next2

}

ans?=?int(math.Min(float64(p1),?float64(p2)))

}

dp[i][s]?=?ans

return?ans

}

//?paintWalls3?is?the?third?function?from?the?given?Java?code.

func?paintWalls3(cost?[]int,?time?[]int)?int?{

n?:=?len(cost)

dp?:=?make([]int,?n+1)

for?i?:=?range?dp?{

dp[i]?=?math.MaxInt32

}

dp[0]?=?0

for?i?:=?n?-?1;?i?>=?0;?i--?{

for?s?:=?n;?s?>=?1;?s--?{

if?s-1-time[i]?<=?0?{

dp[s]?=?int(math.Min(float64(dp[s]),?float64(cost[i])))

}?else?if?dp[s-1-time[i]]?!=?math.MaxInt32?{

dp[s]?=?int(math.Min(float64(dp[s]),?float64(cost[i]+dp[s-1-time[i]])))

}

}

}

return?dp[n]

}

func?main()?{

cost?:=?[]int{1,?2,?3,?2}

time?:=?[]int{1,?2,?3,?2}

fmt.Println("Result?1:",?paintWalls1(cost,?time))

fmt.Println("Result?2:",?paintWalls2(cost,?time))

fmt.Println("Result?3:",?paintWalls3(cost,?time))

}

在这里插入图片描述rust完整代码如下:

fn?paint_walls1(cost:?Vec,?time:?Vec)?->?i32?{

process1(&cost,?&time,?0,?cost.len()?as?i32)

}

fn?process1(cost:?&Vec,?time:?&Vec,?i:?i32,?s:?i32)?->?i32?{

if?s?<=?0?{

return?0;

}

if?(i?as?usize)?==?cost.len()?{

return?i32::MAX;

}?else?{

let?p1?=?process1(cost,?time,?i?+?1,?s);

let?mut?p2?=?i32::MAX;

let?next2?=?process1(cost,?time,?i?+?1,?s?-?1?-?time[i?as?usize]);

if?next2?!=?i32::MAX?{

p2?=?cost[i?as?usize]?+?next2;

}

return?p1.min(p2);

}

}

fn?paint_walls2(cost:?Vec,?time:?Vec)?->?i32?{

let?n?=?cost.len();

let?mut?dp?=?vec![vec![-1;?n?+?1];?n?+?1];

process2(&cost,?&time,?0,?n?as?i32,?&mut?dp)

}

fn?process2(cost:?&Vec,?time:?&Vec,?i:?i32,?s:?i32,?dp:?&mut?Vec<Vec>)?->?i32?{

if?s?<=?0?{

return?0;

}

if?dp[i?as?usize][s?as?usize]?!=?-1?{

return?dp[i?as?usize][s?as?usize];

}

let?ans;

if?(i?as?usize)?==?cost.len()?{

ans?=?i32::MAX;

}?else?{

let?p1?=?process2(cost,?time,?i?+?1,?s,?dp);

let?mut?p2?=?i32::MAX;

let?next2?=?process2(cost,?time,?i?+?1,?s?-?1?-?time[i?as?usize],?dp);

if?next2?!=?i32::MAX?{

p2?=?cost[i?as?usize]?+?next2;

}

ans?=?p1.min(p2);

}

dp[i?as?usize][s?as?usize]?=?ans;

ans

}

fn?paint_walls3(cost:?Vec,?time:?Vec)?->?i32?{

let?n?=?cost.len();

let?mut?dp?=?vec![i32::MAX;?n?+?1];

dp[0]?=?0;

for?i?in?(0..n).rev()?{

for?s?in?(1..=n?as?i32).rev()?{

if?s?-?1?-?time[i]?<=?0?{

dp[s?as?usize]?=?dp[s?as?usize].min(cost[i]);

}?else?if?dp[(s?-?1?-?time[i])?as?usize]?!=?i32::MAX?{

dp[s?as?usize]?=?dp[s?as?usize].min(cost[i]?+?dp[(s?-?1?-?time[i])?as?usize]);

}

}

}

dp[n]

}

fn?main()?{

let?cost?=?vec![1,?2,?3,?2];

let?time?=?vec![1,?2,?3,?2];

let?result1?=?paint_walls1(cost.clone(),?time.clone());

let?result2?=?paint_walls2(cost.clone(),?time.clone());

let?result3?=?paint_walls3(cost.clone(),?time.clone());

println!("Result?for?paint_walls1:?{}",?result1);

println!("Result?for?paint_walls2:?{}",?result2);

println!("Result?for?paint_walls3:?{}",?result3);

}

在这里插入图片描述c++完整代码如下:

#include

#include

#include

using?namespace?std;

//?暴力递归

int?process1(vector&?cost,?vector&?time,?int?i,?int?s)?{

if?(s?<=?0)?{

return?0;

}

if?(i?==?cost.size())?{

return?INT_MAX;

}

else?{

int?p1?=?process1(cost,?time,?i?+?1,?s);

int?p2?=?INT_MAX;

int?next2?=?process1(cost,?time,?i?+?1,?s?-?1?-?time[i]);

if?(next2?!=?INT_MAX)?{

p2?=?cost[i]?+?next2;

}

return?min(p1,?p2);

}

}

int?paintWalls1(vector&?cost,?vector&?time)?{

return?process1(cost,?time,?0,?cost.size());

}

//?暴力递归改记忆化搜索

int?process2(vector&?cost,?vector&?time,?int?i,?int?s,?vector<vector>&?dp)?{

if?(s?<=?0)?{

return?0;

}

if?(dp[i][s]?!=?-1)?{

return?dp[i][s];

}

int?ans;

if?(i?==?cost.size())?{

ans?=?INT_MAX;

}

else?{

int?p1?=?process2(cost,?time,?i?+?1,?s,?dp);

int?p2?=?INT_MAX;

int?next2?=?process2(cost,?time,?i?+?1,?s?-?1?-?time[i],?dp);

if?(next2?!=?INT_MAX)?{

p2?=?cost[i]?+?next2;

}

ans?=?min(p1,?p2);

}

dp[i][s]?=?ans;

return?ans;

}

int?paintWalls2(vector&?cost,?vector&?time)?{

int?n?=?cost.size();

vector<vector>?dp(n?+?1,?vector(n?+?1,?-1));

return?process2(cost,?time,?0,?n,?dp);

}

//?严格位置依赖的动态规划?+?空间压缩

int?paintWalls3(vector&?cost,?vector&?time)?{

int?n?=?cost.size();

vectordp(n?+?1,?INT_MAX);

dp[0]?=?0;

for?(int?i?=?n?-?1;?i?>=?0;?i--)?{

for?(int?s?=?n;?s?>=?1;?s--)?{

if?(s?-?1?-?time[i]?<=?0)?{

dp[s]?=?min(dp[s],?cost[i]);

}

else?if?(dp[s?-?1?-?time[i]]?!=?INT_MAX)?{

dp[s]?=?min(dp[s],?cost[i]?+?dp[s?-?1?-?time[i]]);

}

}

}

return?dp[n];

}

int?main()?{

vectorcost?=?{?1,?2,?3,?2?};

vectortime?=?{?1,?2,?3,?2?};

cout?<

cout?<

cout?<

return?0;

}

在这里插入图片描述c语言完整代码如下:

#include

#include

#include

int?process1(int*?cost,?int*?time,?int?i,?int?s,?int?costSize);

int?paintWalls1(int*?cost,?int?costSize,?int*?time,?int?timeSize)?{

return?process1(cost,?time,?0,?costSize,?costSize);

}

int?process1(int*?cost,?int*?time,?int?i,?int?s,?int?costSize)?{

if?(s?<=?0)?{

return?0;

}

if?(i?==?costSize)?{

return?INT_MAX;

}

else?{

int?p1?=?process1(cost,?time,?i?+?1,?s,?costSize);

int?p2?=?INT_MAX;

int?next2?=?process1(cost,?time,?i?+?1,?s?-?1?-?time[i],?costSize);

if?(next2?!=?INT_MAX)?{

p2?=?cost[i]?+?next2;

}

return?(p1?<?p2)???p1?:?p2;

}

}

int?process2(int*?cost,?int*?time,?int?i,?int?s,?int?costSize,?int**?dp);

int?paintWalls2(int*?cost,?int?costSize,?int*?time,?int?timeSize)?{

int**?dp?=?(int**)malloc((costSize?+?1)?*?sizeof(int*));

for?(int?i?=?0;?i?<=?costSize;?i++)?{

dp[i]?=?(int*)malloc((costSize?+?1)?*?sizeof(int));

for?(int?j?=?0;?j?<=?costSize;?j++)?{

dp[i][j]?=?-1;

}

}

int?result?=?process2(cost,?time,?0,?costSize,?costSize,?dp);

for?(int?i?=?0;?i?<=?costSize;?i++)?{

free(dp[i]);

}

free(dp);

return?result;

}

int?process2(int*?cost,?int*?time,?int?i,?int?s,?int?costSize,?int**?dp)?{

if?(s?<=?0)?{

return?0;

}

if?(dp[i][s]?!=?-1)?{

return?dp[i][s];

}

int?ans;

if?(i?==?costSize)?{

ans?=?INT_MAX;

}

else?{

int?p1?=?process2(cost,?time,?i?+?1,?s,?costSize,?dp);

int?p2?=?INT_MAX;

int?next2?=?process2(cost,?time,?i?+?1,?s?-?1?-?time[i],?costSize,?dp);

if?(next2?!=?INT_MAX)?{

p2?=?cost[i]?+?next2;

}

ans?=?(p1?<?p2)???p1?:?p2;

}

dp[i][s]?=?ans;

return?ans;

}

int?paintWalls3(int*?cost,?int?costSize,?int*?time,?int?timeSize);

int?paintWalls3(int*?cost,?int?costSize,?int*?time,?int?timeSize)?{

int*?dp?=?(int*)malloc((costSize?+?1)?*?sizeof(int));

for?(int?i?=?0;?i?<=?costSize;?i++)?{

dp[i]?=?INT_MAX;

}

dp[0]?=?0;

for?(int?i?=?costSize?-?1;?i?>=?0;?i--)?{

for?(int?s?=?costSize;?s?>=?1;?s--)?{

if?(s?-?1?-?time[i]?<=?0)?{

dp[s]?=?(dp[s]?<?cost[i])???dp[s]?:?cost[i];

}

else?if?(dp[s?-?1?-?time[i]]?!=?INT_MAX)?{

dp[s]?=?(dp[s]?<?cost[i]?+?dp[s?-?1?-?time[i]])???dp[s]?:?cost[i]?+?dp[s?-?1?-?time[i]];

}

}

}

int?result?=?dp[costSize];

free(dp);

return?result;

}

int?main()?{

int?cost[]?=?{?1,?2,?3,?2?};

int?time[]?=?{?1,?2,?3,?2?};

int?result1?=?paintWalls1(cost,?4,?time,?4);

printf("Result?of?paintWalls1:?%d\n",?result1);

int?result2?=?paintWalls2(cost,?4,?time,?4);

printf("Result?of?paintWalls2:?%d\n",?result2);

int?result3?=?paintWalls3(cost,?4,?time,?4);

printf("Result?of?paintWalls3:?%d\n",?result3);

return?0;

}

在这里插入图片描述

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OiGc4vgAgkiwjjOTDQSG2gWQ0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

相关快讯

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券
http://www.vxiaotou.com