leetcode 198. House Robber
给定一系列整数,取整数,相邻不能取。
解法有二:
动态规划:
int rob(vector<int>& nums) { if (nums.size() == 0) return 0; if (nums.size() == 1) return nums[0]; if (nums.size() == 2) return max(nums[0], nums[1]); int ret = 0; int last_2 = nums[0]; int last_1 = max(nums[1], nums[0]); for (int i = 2; i < nums.size(); ++i) { ret = max(last_2 + nums[i], last_1); last_2 = last_1; last_1 = ret; } return ret; }
求差:
取last = nk - n(k - 1) + n(k - 2) - n(k - 3)...,当遍历到当前元素时,做差,如果结果为正数,则取;否则置0(相当于断开)。
而上式和sum求和除二等于相邻元素和。
int rob(vector<int>& nums) { if (nums.size() == 0) return 0; int last = 0; int sum = 0; int ret = 0; for (int i = 0; i < nums.size(); ++i) { if (nums[i] - last <= 0) { ret = ret + (last + sum) / 2; last = 0; sum = 0; } else { last = nums[i] - last; sum += nums[i]; } } ret = ret + (last + sum) / 2; return ret; }
【本文章出自博客园willaty,转载请注明作者出处,误差欢迎指出~】