یک سوال الگوریتمی که توی مصاحبه پرسیدن: (فارسی سازی شده)
صورت مسئله به زبان ساده:
• یه سری کارت داریم که از چپ به راست چیده شدن، مثل:
[-2, 4, -3, 5, -1, 2]
• روی هر کارت یه عدد نوشته شده. میتونه منفی یا مثبت باشه.
• ما از چپ به راست باید کارتها رو انتخاب کنیم.
• با برداشتن هر کارت، عدد اون به “قدرت فعلی” ما اضافه میشه.
• قدرت اولیه ما: 0
• ولی یه قانون مهم داریم:
قدرت ما در هیچ لحظهای نباید صفر یا منفی بشه. اگر بشه، بازی تمومه.
🎯 هدف:
ما باید بیشترین تعداد کارت رو انتخاب کنیم، طوری که قدرتمون همیشه بیشتر از صفر باقی بمونه.
🔍 مثال:
فرض کن کارتها این باشن
کارتها: [3, -2, 4, -5, 2, -1]
قدرت اولیه: 0
قدمبهقدم بریم جلو:
1. کارت 3 → قدرت 0+3 = 3 → خوبه ✅
2. کارت -2 → قدرت 3-2 = 1 → هنوز مثبت ✅
3. کارت 4 → قدرت 1+4 = 5 ✅
4. کارت -5 → قدرت 5-5 = 0 ❌ مجاز نیست → نمیتونیم برداریم
5. کارت 2 → قدرت 5+2 = 7 ✅
6. کارت -1 → قدرت 7-1 = 6 ✅
پس مجموعاً 5 تا کارت برداشتیم و زنده موندیم. 🎉
برای اینکه بتونیم همیشه قدرتمون رو حفظ کنیم، یه روش هوشمند داریم:
1. از چپ به راست حرکت میکنیم.
2. هر کارتی که باعث نشه قدرت صفر یا منفی بشه → برمیداریم.
3. اگه کارت منفی بود، توی یه لیست ذخیره میکنیم.
4. اگه در آینده قراره قدرتمون منفی بشه:
• چک میکنیم بین کارتهای منفی که قبلاً برداشتیم، آیا یکی هست که از کارت فعلی بدتر (منفیتر) باشه؟
• اگه بله → اون کارت بدتر رو حذف میکنیم، کارت فعلی رو میگیریم.
توجه : این روش minHeap واقعی نیست
#interview #algorithm
صورت مسئله به زبان ساده:
• یه سری کارت داریم که از چپ به راست چیده شدن، مثل:
[-2, 4, -3, 5, -1, 2]
• روی هر کارت یه عدد نوشته شده. میتونه منفی یا مثبت باشه.
• ما از چپ به راست باید کارتها رو انتخاب کنیم.
• با برداشتن هر کارت، عدد اون به “قدرت فعلی” ما اضافه میشه.
• قدرت اولیه ما: 0
• ولی یه قانون مهم داریم:
قدرت ما در هیچ لحظهای نباید صفر یا منفی بشه. اگر بشه، بازی تمومه.
🎯 هدف:
ما باید بیشترین تعداد کارت رو انتخاب کنیم، طوری که قدرتمون همیشه بیشتر از صفر باقی بمونه.
🔍 مثال:
فرض کن کارتها این باشن
کارتها: [3, -2, 4, -5, 2, -1]
قدرت اولیه: 0
قدمبهقدم بریم جلو:
1. کارت 3 → قدرت 0+3 = 3 → خوبه ✅
2. کارت -2 → قدرت 3-2 = 1 → هنوز مثبت ✅
3. کارت 4 → قدرت 1+4 = 5 ✅
4. کارت -5 → قدرت 5-5 = 0 ❌ مجاز نیست → نمیتونیم برداریم
5. کارت 2 → قدرت 5+2 = 7 ✅
6. کارت -1 → قدرت 7-1 = 6 ✅
پس مجموعاً 5 تا کارت برداشتیم و زنده موندیم. 🎉
برای اینکه بتونیم همیشه قدرتمون رو حفظ کنیم، یه روش هوشمند داریم:
1. از چپ به راست حرکت میکنیم.
2. هر کارتی که باعث نشه قدرت صفر یا منفی بشه → برمیداریم.
3. اگه کارت منفی بود، توی یه لیست ذخیره میکنیم.
4. اگه در آینده قراره قدرتمون منفی بشه:
• چک میکنیم بین کارتهای منفی که قبلاً برداشتیم، آیا یکی هست که از کارت فعلی بدتر (منفیتر) باشه؟
• اگه بله → اون کارت بدتر رو حذف میکنیم، کارت فعلی رو میگیریم.
توجه : این روش minHeap واقعی نیست
function maxCardCount(cards) {
let power = 0;
let count = 0;
const minHeap = [];
for (let card of cards) {
if (power + card <= 0) {
// Can't pick this card directly — check if we can replace a more negative one
if (card < 0 && minHeap.length > 0 && minHeap[minHeap.length - 1] < card) {
// Replace the most negative card
const removed = minHeap.pop();
power -= removed;
minHeap.push(card);
power += card;
// count stays the same
minHeap.sort((a, b) => a - b); // keep heap sorted
}
continue; // skip if we can’t afford the card
}
// Safe to pick the card
power += card;
count++;
if (card < 0) {
minHeap.push(card);
minHeap.sort((a, b) => a - b);
}
}
return count;
}
#interview #algorithm