letecode [198] - House Robber
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.
Example 1:
Input: [1,2,3,1] Output: 4 Explanation: Rob house 1 (money = 1) and then rob house 3 (money = 3). Total amount you can rob = 1 + 3 = 4.
Example 2:
Input: [2,7,9,3,1] Output: 12 Explanation: Rob house 1 (money = 2), rob house 3 (money = 9) and rob house 5 (money = 1). Total amount you can rob = 2 + 9 + 1 = 12.
题目大意:
给定一个代表每个房屋存放金额的非负整数数组,小偷需要在不相邻的两房间内偷窃,求小偷偷窃的最高金额。
理 解:
第一想法是:取数组的奇数下标对应值之和和偶数下标对应值之和,比较取较大者,但没有考虑到部分解可能不是最优解。
对奇数和sumOdd,每次加新的值后与sumEven比较,若小于sumEven,则表明当前最优解在前面,sumOdd = sumEven。
对于偶数同理。比较两个和,取较大者。
代 码 C++:
class Solution { public: int rob(vector<int>& nums) { int sumOdd=0,sumEven=0; for(int i=0;i<nums.size();++i){ if(i&1==1){ sumOdd += nums[i]; if(sumOdd<sumEven) sumOdd = sumEven; }else{ sumEven += nums[i]; if(sumEven<sumOdd) sumEven = sumOdd; } } return sumOdd>sumEven?sumOdd:sumEven; } };
运行结果:
执行用时 :4 ms, 在所有C++提交中击败了93.13%的用户