kaiyun开云中国2026世界杯官网入口

热线电话:
kaiyun开云中国2026世界杯官网入口
热门搜索: 演员 法国 发文 回复 年后

kaiyun(中国)2026世界杯官方网站 2026-06-12: 打家劫舍 V。用go谈话, 你当今要惩办一个“相邻房屋

开云体育 点击次数:108 发布日期:2026-06-12 23:14

kaiyun(中国)2026世界杯官方网站 2026-06-12: 打家劫舍 V。用go谈话, 你当今要惩办一个“相邻房屋

2026-06-12:打家劫舍 V。用go谈话,你当今要惩办一个“相邻房屋不成同色同期偷”的求最大收益问题:

• 每间房屋还有一个脸色代码 colors[i]。

• 轨范是:淌若两间房屋相邻(下标 i 和 i+1)且它们的脸色代码相似,那么这两间不成同期被偷。

• 在得志上述限制的前提下,给与要偷的房屋,使得赢得的总金额最大。

• 请输出在最优给与下能得到的最大总金额。

1

1

输入: nums = [10,1,3,9], colors = [1,1,1,2]。

输出: 22。

评释:

给与第 i = 0 间房屋(金额为 10)、第 i = 2 间房屋(金额为 3)和第 i = 3 间房屋(金额为 9)。

此给与是正当的,因为第 i = 0 和 i = 2 间房屋不相邻,且第 i = 2 和 i = 3 间房屋脸色不同。

因此,偷窃的总金额为 10 + 3 + 9 = 22。

题目来独力扣3840。

一、逐轮分步演算齐备经过(以示例nums=[10,1,3,9]、colors=[1,1,1,2]为例)

运转动阶段(i=0,第一间房屋)

房屋0:金额10,脸色1

• 数组长度不为0,跳过畛域复返0逻辑

• f1运转动为0:不偷0号房,收益0

• f2运转动为10:偷0号房,收益10

刻下景色:f1=0(不偷0),f2=10(偷0)

第一轮轮回:i=1(第二间房屋,金额1,脸色1)

对比相邻脸色:colors[1]=1,colors[0]=1,相邻同色,触发同色分支逻辑。

轨范:i和i-1同色,不成同期偷i和i-1,因此偷刻下i的决策只可来自「不偷i-1的收益f1 + 刻下房屋金额」,再和「不偷刻下i,保留偷i-1的收益f2」取更大值动作money。

1. 候选1(偷1号房):f1 + nums[1] = 0 + 1 = 1

2. 候选2(不偷1号房):f2 = 10

3. 二者取大,money = max(1,10) = 10

4. 滚动更新景色:

f1 = 旧f2 = 10(当今f1代表不偷1号房的最大收益)

f2 = money = 10(当今f2代表偷1号房的最大收益)

本轮竣事景色:f1=10,f2=10

第二轮轮回:i=2(第三间房屋,米兰milan(中国)体育官方网站金额3,脸色1)

对比相邻脸色:colors[2]=1,colors[1]=1,相邻同色,再次插足同色分支。

1. 候选1(偷2号房):f1 + nums[2] = 10 + 3 = 13

2. 候选2(不偷2号房):f2 = 10

3. 二者取大,money = max(13,10) = 13

4. 滚动更新景色:

f1 = 旧f2 = 10(不偷2号房最大收益)

f2 = money = 13(偷2号房最大收益)

本轮竣事景色:f1=10,f2=13

解读:此时偷2号房最优收益13,对应决策是不偷1号、偷0号+偷2号(10+3=13),和题目最优决策中间关节匹配。

第三轮轮回:i=3(第四间房屋,金额9,脸色2)

对比相邻脸色:colors[3]=2,colors[2]=1,相邻异色,开云·kaiyun体育插足异色分支逻辑。

轨范:i和i-1脸色不同,无偷窃突破,不错同期偷i-1和i,因此偷刻下i的收益 = 偷i-1的最大收益f2 + 刻下房屋金额,获胜赋值给money。

1. money = f2 + nums[3] = 13 + 9 = 22

2. 滚动更新景色:

f1 = 旧f2 = 13(不偷3号房的最大收益)

f2 = money = 22(偷3号房的最大收益)

本轮竣事景色:f1=13,f2=22

轮回竣事,复返结果

轮回遍历完通盘4间房屋,最终f2存储遍历到终末一间房屋、偷终末一间时的全局最大收益,复返22,和题目输出一致。

二、通用算法齐备逻辑关节(脱离示例,通用惩办随心n间房屋)

关节1:畛域判断

淌若房屋总和n=0,不存在可偷窃房屋,获胜复返总收益0。

关节2:DP景色运转动(惩办第0号首间房屋)

• f1:不偷第0间,收益固定为0;

• f2:偷第0间,收益便是第一间房屋金额nums[0];

关节3:从第1间到终末一间,轮番遍历每一间房屋i(轮回i=1 ~ n-1)

每一次轮回扩充固定三步:

关节3.1 判断刻下i和前一间i-1的脸色干系

分支A:colors[i] != colors[i-1](相邻异色)

相邻异色无偷窃突破,不错同期偷前一间和刻下间。

刻下房屋偷窃最优收益money = 偷前一间的最大收益f2 + 刻下房屋金额nums[i]

分支B:colors[i] == colors[i-1](相邻同色)

相邻同色不成两间齐偷,有两种给与:

1. 不偷刻下房屋:收益=偷前一间的收益f2;

2. 偷刻下房屋:只可不偷前一间,收益=不偷前一间的收益f1 + nums[i];

取两种给与里数值更大的动作money。

关节3.2 滚动更新DP景色变量

完成money盘算后,刷新两个景色变量,为下一间房屋遍历作念准备:

1. f1 赋值为本来的f2:下一轮中,f1代表「不偷刻下i号房」的最大收益;

2. f2 赋值为本轮算出的money:下一轮中,f2代表「偷刻下i号房」的最大收益。

关节4:遍历一齐房屋后输出结果

轮回竣事后,f2保存的是遍历到终末一间房屋、包含偷终末一间决策的全局最大总金额,获胜复返f2动作谜底。

三、本事复杂度、零碎空间复杂度分析

1. 本事复杂度 O(n)

n为房屋总和,算法仅扩充一次单层for轮回,轮回扩充次数刚巧n-1次;

轮回里面仅包含脸色比拟、浅易四则运算、大小比拟,通盘操作齐是常数本事O(1);

无嵌套轮回、无排序、无递归,全体本事复杂度线性O(n),不错得志题目n≤100000的数据畛域。

2. 零碎空间复杂度 O(1)

输入的nums、colors属于题目给定输入数组,不计入算法零碎空间;

算法里面仅弥远拓荒3个固定变量:f1、f2、money,变量数目不随房屋数目n变化;

莫得创建DP数组、切片、哈希表等随n扩容的数据结构;

仅使用常数级临时存储空间,零碎空间复杂度为O(1)。

Go齐备代码如下:

package main

import (

"fmt"

)

func rob(nums []int, colors []int)int64 {

iflen(nums) == 0 {

return0

}

f1 := int64(0)

f2 := int64(nums[0])

n := len(nums)

for i := 1; i

var money int64

if colors[i] != colors[i-1] {

money = f2 + int64(nums[i])

} else {

if f1+int64(nums[i]) > f2 {

money = f1 + int64(nums[i])

} else {

money = f2

}

}

f1 = f2

f2 = money

}

return f2

}

func main {

nums := []int{10, 1, 3, 9}

colors := []int{1, 1, 1, 2}

result := rob(nums, colors)

fmt.Println(result)

}

Python齐备代码如下:

# -*-coding:utf-8-*-

from typing import List

class Solution:

def rob(self, nums: List[int], colors: List[int]) -> int:

iflen(nums) == 0:

return0

f1 = 0

f2 = nums[0]

n = len(nums)

for i in range(1, n):

if colors[i] != colors[i-1]:

money = f2 + nums[i]

else:

money = max(f1 + nums[i], f2)

f1 = f2

f2 = money

return f2

滚球app2026世界杯中国官网下载

if __name__ == "__main__":

nums = [10, 1, 3, 9]

colors = [1, 1, 1, 2]

result = Solution.rob(nums, colors)

print(result)

C++齐备代码如下:

#include

#include

#include

using namespace std;

long long rob(vector& nums, vector& colors) {

if (nums.empty) {

return0;

}

long long f1 = 0;

long long f2 = nums[0];

int n = nums.size;

for (int i = 1; i

long long money;

if (colors[i] != colors[i-1]) {

money = f2 + nums[i];

} else {

money = max(f1 + nums[i], f2);

}

f1 = f2;

f2 = money;

}

return f2;

}

int main {

vector nums = {10, 1, 3, 9};

vector colors = {1, 1, 1, 2};

long long result = rob(nums, colors);

cout

return0;

}

咱们深信东谈主工智能为平凡东谈主提供了一种“增强器具”,并奋力于共享全方向的AI学问。在这里,您不错找到最新的AI科普著述、器具评测、提高成果的遁藏以及行业知悉。

接待样式“福大大架构师逐日一题”kaiyun(中国)2026世界杯官方网站,发音信可赢得口试长途,让AI助力您的改日发展。

开云体育