当前位置: 首页 > news >正文

Leetcode 213. 打家劫舍 II

原题链接:. - 力扣(LeetCode)

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。

给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。

示例 1:

输入:nums = [2,3,2]
输出:3
解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。

示例 2:

输入:nums = [1,2,3,1]
输出:4
解释:你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。

示例 3:

输入:nums = [1,2,3]
输出:3

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 1000

思路:

本题与 打家劫舍 的区别在于前者的 最后一个房子和第一个房子是相邻的。即是环形的。用 f [ i ] 表示 前 i 个房子能偷盗的最大价值。如果偷盗第一个房子,则 第二个和最后一个房子不能偷盗,即剩下的偷盗范围是 第三个房子至倒数第二个房子。如果不偷盗第一个房子,则剩下的偷盗范围是第二个房子至最后一个房子。

代码:

class Solution {public int rob(int[] nums) {int n = nums.length;return Math.max(nums[0]+rob(nums,2,n-1),rob(nums,1,n));}int rob(int[] nums,int start,int end){//[start,end)左闭右开//f[i]表示前i个房子中偷盗的金额最大值int f0 = 0, f1 = 0;for(int i=start;i<end;i++){int newF = Math.max(f1, f0 + nums[i]);f0 = f1;f1 = newF;}return f1;}
}

参考:. - 力扣(LeetCode)


http://www.mrgr.cn/news/38442.html

相关文章:

  • Spring的IOC和DI入门案例分析和实现
  • 退出系统接口代码开发
  • JAVA入门-集合与泛型
  • 【iOS】计算器的仿写
  • 文件flac怎么转成mp3?这几种方法每个人都能学会!
  • 3. Linux系统——vim编辑器
  • Linux【基础指令汇总】
  • WPF入门教学二十二 多线程与异步编程
  • 3.数据结构与算法-基本概念和术语
  • 59 双向循环神经网络_by《李沐:动手学深度学习v2》pytorch版
  • sentinel原理源码分析系列(二)-动态规则和transport
  • JUC并发编程_深入理解CAS
  • 如何在Cursor中创建一个RN项目,并部署到Vercel中,可以通过Web访问
  • 赵长鹏今日获释,下一步会做什么?币安透露2024年加密货币牛市的投资策略!
  • 计算机网络自顶向下(1)---网络基础
  • 【HTML5】html5开篇基础(3)
  • 什么是JavaScript 中的类型转换机制,它是如何工作的
  • DarkLabel2.4版本导入MOT17数据集
  • 国庆头像制作小程序相关代码
  • 淘宝扭蛋机小程序:提高扭蛋吸引力