Greedy¶
Table of Contents¶
- 53. Maximum Subarray (Medium)
- 55. Jump Game (Medium)
53. Maximum Subarray¶
-
LeetCode | LeetCode CH (Medium)
-
Tags: array, divide and conquer, dynamic programming
53. Maximum Subarray - Python Solution
from typing import List
# DP Kadane
def maxSubArrayDP(nums: List[int]) -> int:
dp = [0 for _ in range(len(nums))]
dp[0] = nums[0]
maxSum = nums[0]
for i in range(1, len(nums)):
dp[i] = max(
dp[i - 1] + nums[i], # continue the previous subarray
nums[i], # start a new subarray
)
maxSum = max(maxSum, dp[i])
return maxSum
# Greedy
def maxSubArrayGreedy(nums: List[int]) -> int:
max_sum = nums[0]
cur_sum = 0
for num in nums:
cur_sum = max(cur_sum + num, num)
max_sum = max(max_sum, cur_sum)
return max_sum
# Prefix Sum
def maxSubArrayPrefixSum(nums: List[int]) -> int:
prefix_sum = 0
prefix_sum_min = 0
res = float("-inf")
for num in nums:
prefix_sum += num
res = max(res, prefix_sum - prefix_sum_min)
prefix_sum_min = min(prefix_sum_min, prefix_sum)
return res
nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
print(maxSubArrayDP(nums)) # 6
print(maxSubArrayGreedy(nums)) # 6
print(maxSubArrayPrefixSum(nums)) # 6
55. Jump Game¶
-
LeetCode | LeetCode CH (Medium)
-
Tags: array, dynamic programming, greedy
- Return
True
if you can reach the last index, otherwiseFalse
.
- Example:
[2, 3, 1, 1, 4, 1, 2, 0, 0]
Index | Value | Index + Value | Max Reach | Max Reach >= Last Index |
---|---|---|---|---|
0 | 2 | 2 | 2 | False |
1 | 3 | 4 | 4 | False |
2 | 1 | 3 | 4 | False |
3 | 1 | 4 | 4 | False |
4 | 4 | 8 | 8 | True |
5 | 1 | 6 | 8 | True |
6 | 2 | 8 | 8 | True |
7 | 0 | 7 | 8 | True |
8 | 0 | 8 | 8 | True |
55. Jump Game - Python Solution
from typing import List
# Greedy - Interval
def canJump(nums: List[int]) -> bool:
maxReach = 0
i = 0
n = len(nums)
while i <= maxReach:
maxReach = max(maxReach, i + nums[i])
if maxReach >= n - 1:
return True
i += 1
return False
print(canJump([2, 3, 1, 1, 4, 1, 2, 0, 0])) # True
55. Jump Game - C++ Solution
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
bool canJump(vector<int>& nums) {
int canReach = 0;
int n = nums.size();
for (int i = 0; i < n; i++) {
if (i > canReach) return false;
canReach = max(canReach, i + nums[i]);
}
return true;
}
};
int main() {
Solution obj;
vector<int> nums = {2, 3, 1, 1, 4};
cout << obj.canJump(nums) << endl;
return 0;
}