1.6 Kadane's Algorithm
চিনবেন কীভাবে
"maximum/minimum subarray sum", contiguous, এক পাসে চলমান best — আসলে ১-ভেরিয়েবল DP: "আগেরটা টেনে নেব, না নতুন শুরু করব?"
Demo · approach · কোড — আগে নিজে চেষ্টা, আটকালে খুলুন
Demo: Maximum Subarray — LC 53 (Medium)
Statement (Demo): integer array nums দেওয়া — সবচেয়ে বড় যোগফল সম্পন্ন contiguous subarray খুঁজে বের করুন এবং সেই যোগফল return করুন।
উদাহরণ: [-2,1,-3,4,-1,2,1,-5,4] → 6 | ⚡ n ≤ 10⁵, -10⁴ ≤ nums[i] ≤ 10⁴
Approach: প্রতিটা index-এ সিদ্ধান্ত — আগের চলমান sum positive contribution দিলে যোগ করুন, নাহলে এখান থেকে নতুন subarray শুরু। global best আলাদা রাখুন।
function maxSubArray(nums) {
let cur = nums[0],
best = nums[0];
for (let i = 1; i < nums.length; i++) {
cur = Math.max(nums[i], cur + nums[i]); // নতুন শুরু vs টেনে নেওয়া
best = Math.max(best, cur);
}
return best;
}
Complexity: Time O(n), Space O(1)
প্রবলেম
- Maximum Product SubarrayLC 152(negative × negative = positive → min-ও ট্র্যাক করুন)
Statement: integer array
numsদেওয়া — সবচেয়ে বড় গুণফল সম্পন্ন contiguous subarray খুঁজে সেই গুণফল return করুন।
উদাহরণ:[2,3,-2,4]→6([2,3]) | ⚡n ≤ 2×10⁴,-10 ≤ nums[i] ≤ 10নোট · ফাঁকা