53. Maximum Subarray
https://leetcode.com/problems/maximum-subarray/ 与えられた値を1つずつ足していき、最も大きな値を選ぶ総当りは思いついたが、O(n2)で遅い。
部分配列をO(n)で計算するKadane Algorithm というアルゴリズムがあるようでした。
Kadaneのアルゴリズム—(動的計画法)—どのようにそしてなぜそれが機能するのか?
総当り
class Solution { public: int max_sum = INT_MIN; int maxSubArray(vector<int>& nums) { for(int i = 0; nums.size() > i; i++){ int currrent_sum = 0; for(int j=i; nums.size() > j; j++){ currrent_sum += nums[j]; max_sum = max(max_sum, currrent_sum); } } return max_sum; } };
Kaneda Algorithm
class Solution { public: int maxSubArray(vector<int>& nums) { int max_sum = INT_MIN; int tmpSum = 0; for(int i =0; i < nums.size(); i++){ tmpSum = max(nums[i], nums[i] + tmpSum); if(tmpSum > max_sum){ max_sum = tmpSum; } } return max_sum; } };