zoukankan      html  css  js  c++  java
  • Leetcode 213. 打家劫舍 II

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

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

    示例 1:

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

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

    思路:因为是环状的,所以分成了两个情况,取第一个就不能要最后一个,反之亦然

    所以就分成两个情况,隔开取,然后比较大小就好了

     1 class Solution
     2 {
     3 public:
     4     int rob(vector<int>& nums){
     5         if(nums.empty())
     6         {
     7             return 0;
     8         }
     9         int odd = nums[0], even = nums[0];
    10         int ans = 0;
    11         for(int i = 2; i < nums.size() - 1; i++){
    12             int tem = odd;
    13             odd = even + nums[i];
    14             even = max(tem, even);
    15         }
    16         //printf("%d %d
    ",odd, even);
    17         ans = max(odd, even);
    18         odd = 0, even = 0;
    19         for(int i = 1; i < nums.size(); i++){
    20             int tem = odd;
    21             odd = even + nums[i];
    22             even = max(tem, even);
    23         }
    24         //printf("%d %d
    ",odd, even);
    25         ans = max(ans,max(odd, even));
    26         return ans;
    27     }
    28 };
    View Code
  • 相关阅读:
    大道至简 读后感01
    《人月神话》读后感
    水王继续
    软工大作业DB天气项目风险评估
    自我调查 使用输入法
    课堂练习之找“水王”
    浪潮之巅阅读笔记之三
    浪潮之巅阅读笔记之二
    浪潮之巅阅读笔记之一
    课程改进意见
  • 原文地址:https://www.cnblogs.com/tijie/p/12206235.html
Copyright © 2011-2022 走看看