From dc79dc94cb2cf56d2c79904085c2cffe05b1f545 Mon Sep 17 00:00:00 2001 From: colorbox Date: Wed, 8 Apr 2026 06:50:39 +0900 Subject: [PATCH] 198. House Robber https://leetcode.com/problems/house-robber/ --- 198/step1.cpp | 36 ++++++++++++++++++++++++++++++++++++ 198/step2.cpp | 15 +++++++++++++++ 198/step2_2.cpp | 17 +++++++++++++++++ 198/step3.cpp | 15 +++++++++++++++ 4 files changed, 83 insertions(+) create mode 100644 198/step1.cpp create mode 100644 198/step2.cpp create mode 100644 198/step2_2.cpp create mode 100644 198/step3.cpp diff --git a/198/step1.cpp b/198/step1.cpp new file mode 100644 index 0000000..17671b9 --- /dev/null +++ b/198/step1.cpp @@ -0,0 +1,36 @@ +// Solve Time: 10:49 +// +// Space Complexity: O(n) +// Time Complexity: O(n) + +/* + +なんとなく方針をを決めてそのまま実装する +配列を用意して、特定の位置における最大利益、とする。 +同日に隣接する箇所は襲えないので、前日の値をそのまま持ってくるか、一昨日の利益に当日の利益を足すか、のどちらかを選ぶ。 + +benefit += maximumBenefit[i - 2]; +とすべき箇所を +benefit += nums[i - 2]; +としてしまった + +*/ + +class Solution { +public: + int rob(vector& nums) { + vector maximumBenefit(nums.size(), 0); + if (nums.size() == 1) { + return nums[0]; + } + maximumBenefit[0] = nums[0]; + for (int i = 1; i < nums.size(); ++i) { + int benefit = nums[i]; + if (i >= 2) { + benefit += maximumBenefit[i - 2]; + } + maximumBenefit[i] = max(benefit, maximumBenefit[i - 1]); + } + return maximumBenefit.back(); + } +}; diff --git a/198/step2.cpp b/198/step2.cpp new file mode 100644 index 0000000..3a60fa5 --- /dev/null +++ b/198/step2.cpp @@ -0,0 +1,15 @@ +class Solution { +public: + int rob(vector& nums) { + vector maximumBenefit(nums.size(), 0); + maximumBenefit[0] = nums[0]; + for (int i = 1; i < maximumBenefit.size(); ++i) { + int benefit = nums[i]; + if (i >= 2) { + benefit += maximumBenefit[i - 2]; + } + maximumBenefit[i] = max(benefit, maximumBenefit[i - 1]); + } + return maximumBenefit.back(); + } +}; diff --git a/198/step2_2.cpp b/198/step2_2.cpp new file mode 100644 index 0000000..adce5ef --- /dev/null +++ b/198/step2_2.cpp @@ -0,0 +1,17 @@ +// 2変数で行う手法 +class Solution { +public: + int rob(vector& nums) { + if (nums.size() == 1) { + return nums.front(); + } + int twoPreviousMaximumRobbedMoney = nums[0]; + int previousMaximumRobbedMoney = max(nums[0], nums[1]); + for (int i = 2; i < nums.size(); ++i) { + int currentMaximumRobbedMoney = max(previousMaximumRobbedMoney, twoPreviousMaximumRobbedMoney + nums[i]); + twoPreviousMaximumRobbedMoney = previousMaximumRobbedMoney; + previousMaximumRobbedMoney = currentMaximumRobbedMoney; + } + return previousMaximumRobbedMoney; + } +}; diff --git a/198/step3.cpp b/198/step3.cpp new file mode 100644 index 0000000..826853a --- /dev/null +++ b/198/step3.cpp @@ -0,0 +1,15 @@ +class Solution { +public: + int rob(vector& nums) { + if (nums.size() == 1) { + return nums[0]; + } + vector maximumRobbedMoney(nums.size(), 0); + maximumRobbedMoney[0] = nums[0]; + maximumRobbedMoney[1] = max(nums[0], nums[1]); + for (int i = 2; i < nums.size(); ++i) { + maximumRobbedMoney[i] = max(maximumRobbedMoney[i - 1], maximumRobbedMoney[i - 2] + nums[i]); + } + return maximumRobbedMoney.back(); + } +};