198. House Robber

来源:互联网 发布:中国公知奇葩言论 编辑:程序博客网 时间:2024/06/12 01:55

题目:入室盗贼

You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent houses have security system connected and it will automatically contact the police if two adjacent houses were broken into on the same night.

Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police.


题意:

你是一名专业强盗,计划沿着一条街打家劫舍。每间房屋都储存有一定数量的金钱,唯一能阻止你打劫的约束条件就是:由于房屋之间有安全系统相连,如果同一个晚上有两间相邻的房屋被闯入,它们就会自动联络警察,因此不可以打劫相邻的房屋。

给定一列非负整数,代表每间房屋的金钱数,计算出在不惊动警察的前提下一晚上最多可以打劫到的金钱数。


思路一:

使用动态规划的思想实现,主要考虑的是当前房屋偷或者不偷对总的收入是否有增加。如果决定偷,则上一步必须是不偷,那么这一步的利润为num[i]+noTake的值,如果决定不偷,则上一步的状态就无所谓是不是偷过,所以直接将上一步的总收入赋值给这一步结果就行。综合可得,到达本房屋时最大利润为max(偷的收入,不偷的收入)取最大值即可。

代码:java版:0ms

public class Solution {    public int rob(int[] nums) {        int take = 0, maxProfit = 0, noTake = 0;        for (int i=0; i<nums.length; ++i) {            take = noTake + nums[i];            noTake = maxProfit;            maxProfit = Math.max(take, noTake);        }        return maxProfit;    }}

代码:C++版:0ms

class Solution {public:    int rob(vector<int>& nums) {        if (nums.size() <=1) return nums.empty() ? 0 : nums[0];        vector<int> dp = {nums[0], max(nums[0], nums[1])};        for (int i=2; i<nums.size(); ++i) {            dp.push_back(max(nums[i] + dp[i-2], dp[i-1]));        }        return dp.back();    }};
另一种写法:代码:C++版:0ms

class Solution {public:    int rob(vector<int>& nums) {        int take = 0, noTake = 0;        for (int i=0; i<nums.size(); ++i) {            int temp = take;            take = noTake + nums[i];            noTake = max(temp, noTake);        }        return max(take, noTake);    }};


思路二:

按照奇偶来取房屋,这样可以保证安全,每一步的过程中对当前奇偶最大值进行比较,以确定当前房屋是否偷。

代码:C++版:0ms

class Solution {public:    int rob(vector<int>& nums) {        int even = 0, odd = 0;        for (int i=0; i<nums.size(); ++i) {            if (i%2 == 0) {                even += nums[i];                even = max(even, odd);            } else {                odd += nums[i];                odd = max(even, odd);            }        }        return max(even, odd);    }};

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 客户说物流太慢了要退货怎么办 天猫买的手机商家不给发票怎么办 天猫超市下单付款后缺货怎么办 淘宝卖家填写假的单号不发货怎么办 天猫商家72小时未发货怎么办 天猫精灵方糖不按顺序播放怎么办 在天猫购物已付款不发货怎么办 淘宝退货商家收到货不退款怎么办 被有实名认证的闲鱼卖家骗了怎么办 我收到了方正的提示函怎么办 淘宝刷q币单被骗了怎么办 中通快递已签收但是东西丢了怎么办 手机不版本低不支持微信下载怎么办 淘宝虚拟商品不支持7天退货怎么办 卖虚拟物品遇到恶意退款买家怎么办 淘宝极速退款后卖家拒绝退款怎么办 我的天猫积分不让换券了怎么办 微信手机话费充错了怎么办 自己进货在淘宝卖被投诉假货怎么办 京东买的电器售后后服务差怎么办 京东到家申请退款卖家不处理怎么办 天猫买了假货商品下架了怎么办 淘宝本地生活服务不能入驻了怎么办 淘宝店铺名在电脑上搜索不到怎么办 已经将退货寄回店家硬说没有怎么办 微信申诉账号短信验证失败怎么办 京东账号换手机号收不到短信怎么办 我的手机收不到短信通知怎么办? 淘宝卖家发货物流单号写错了怎么办 商铺买东西不给调换大小怎么办 圆通快递物流信息一直没更新怎么办 中通快递三天没更新物流信息怎么办 快递已经到了物流信息不更新怎么办 天天快递查询不更新物流信息怎么办 买车下个月分期全部付清怎么办手续 天猫客服介入以后商家不退款怎么办 淘宝上买代购奢侈品买到假货怎么办 淘宝退货卖家收到货拒绝退款怎么办 没收到货但申请了退货退款怎么办 小米商城预约中德手机没货怎么办 电脑用百度网盘下载速度超慢怎么办