题目:打家劫舍 II

核心是将“环”拆解为“两个线性表”

对于环形的 n 间房屋,可以将其拆解为两个场景:

  • 场景 A:不偷最后一间房。此时可以偷的范围是 nums[0] 到 nums[n-2]
  • 场景 B:不偷第一间房。此时可以偷的范围是 nums[1] 到 nums[n-1]

最后的结果一定是两者中的更大值

rob ()

 1// 这里的辅助函数与上题一样
 2int robRange(std::vector<int>& nums, int start, int end)
 3{
 4    int prev1 = 0, prev2 = 0;
 5    for(int i = start; i < end; i++)
 6    {
 7        int temp = prev2;
 8        prev2 = std::max(prev2, prev1 + nums[i]);
 9        prev1 = temp;
10    }
11    return prev2;
12}
13int rob(vector<int>& nums)
14{
15    int n = nums.size();
16    if(n == 1) return nums[0];
17    if(n == 2) return std::max(nums[0], nums[1]);
18
19    int res1 = robRange(nums, 0, n - 1);
20    int res2 = robRange(nums, 1, n);
21
22    return std::max(res1, res2);
23}

来源:语雀原笔记