- Weşand li ser
Obsesyona Min a LeetCode 41: Kûrveçûnek di Pirsgirêka Hejmara Erêniya Windabûyî de
- Nivîskar
- Nav
- Imamuzzaki Abu Salam
- https://x.com/ImBIOS_Dev
پرسیارا "ژمارەى پۆزەتیڤى ونبوو" ya LeetCode (ژمارە 41) بووە بە هەڵواسراوەى کۆد نوسینى دوایینم. ئەمە پرسیارێکى سادە و فێڵبازە کە بیرەکانی منی داگیر کردووە و رێگەى پێداوم بۆ لێکۆڵینەوە لە تایبەتمەندییەکانی و دروستکردنى باشترین چارەسەرى TypeScript کە هەیە. ئەم پۆستە تەنها باسى تێپەڕاندنى پشکنینەکانى کۆد نوسین نییە (هەرچەندە ئەمەش خاڵێکى باشە). باسى خۆشى چارەسەرکردنى کێشەکانە، هیجانى باشترکردن، و جوانیى شێوازى کۆدێکى کارا. و چونکە منیش کەمێک دڵسۆزى ماتماتیکم، ئێمە دەچینە ناو بنەماکانى ماتماتیکیى چارەسەرەکەشەوە.
کێشەکە: گرگێک لە پێستى مێشە!
ئەم کێشەیە رێزێکى نە رێکخراوى ژمارەکانى تەواو پێشکەش دەکات. ئەرکى تۆ: بچووکترین ژمارەى پۆزەتیڤى ونبوو بدۆزیتەوە. دەردەکەوێت راستەوخۆیە؟ جارێکى تر بیر بکەرەوە. سنوورەکانى کاتى و شوێنى ئەم ئەرکەى بەدیاریکراو دەگۆڕن بۆ پرسیارێکى ئەلگۆریتمیی دژوار.
تێکۆشانە سەرەتاییەکان: تەڵەکەى هێزى خاوێن
هەوڵە سەرەتاییەکانم بریتی بوون لە رێکخستن (سەرپێچیکردن لە سنوورى کاتى ) و کۆمەڵەى هاش (تێپەڕاندنى سنوورى شوێنى ). بەڕوونى، پێویستى بە رێبازێکى پێشکەوتووتری هەبوو.
چرکەى یوریکا: گۆڕینی شوێن
تێگەیشتنى سەرەکی ئەوە بوو کە دەتوانم خۆى رێزەکە بەکاربهێنم وەک جەدولێکى هاش. بە رێکخستنەوەى تەواوەکان، دەتوانم ژمارەى لە ڕیزى دابنێم (ئەگەر بێت، لێرەدا درێژیى رێزەکەیە). ئەم گۆڕینەوەى شوێنە رێگە بۆ چارەسەرێکى کارا دەکاتەوە.
پێشهاتى کۆد: چیرۆکێک لە TypeScript
ئەمە مێژووى پێشهاتى کۆدەکەمە، لەگەڵ رونییکردنەوە و تێگەیشتنە ماتماتیکییەکان:
وێرژنی 1: رێبازى سادە (لەگەڵ گۆڕینەوەکانى زێدە)
function firstMissingPositive(nums: number[]): number {
const n = nums.length
// دانانى هەر ژمارەیەک لە جێگەى دروستى ئەگەر لە ناوچەى [1, n] بێت
for (let i = 0; i < n; i++) {
while (nums[i] > 0 && nums[i] <= n && nums[nums[i] - 1] !== nums[i]) {
const correctIndex = nums[i] - 1
;[nums[i], nums[correctIndex]] = [nums[correctIndex], nums[i]] // گۆڕینەوە
}
}
// دۆزینەوەى یەکەم ژمارەى پۆزەتیڤى ونبوو
for (let i = 0; i < n; i++) {
if (nums[i] !== i + 1) {
return i + 1
}
}
// ئەگەر هەموو ژمارەکان لە جێگەى دروستى خۆیان بن، ژمارەى ونبوو n + 1ە
return n + 1
}
ئەم وێرژنە، هەرچەندە کاردەکات، بەڵام لە گۆڕینەوە زێدەکانەوە دەناڵێنێت. ژمارەى گۆڕینەوەکان لە خراپترین حاڵەتدا دەگاتە نزیکى ، هەرچەندە حاڵەتى مامناوەندی نزیکە لە .
ڕونکردنەوە:
رێکخستنەوەى رێزەکە: هەر ژمارەیەکى
nums[i]
لە ڕیزى "دروستى" خۆى دادەنرێت (nums[i] - 1
) ئەگەر لە ناوچەى[1, n]
بێت و لە جێگەى دروستى خۆیدا نەبێت.ناساندنى ژمارەى پۆزەتیڤى ونبوو: دوای رێکخستنەوە، یەکەم ڕیزى
i
کەnums[i] !== i + 1
دەردەکەوێت، ئاماژە بەوە دەکات کەi + 1
ژمارەى پۆزەتیڤى ونبووە.گێڕانەوەى n + 1 ئەگەر پێویست بوو: ئەگەر هەموو ژمارەکان لە
1
بۆn
لە جێگەى دروستى خۆیان بن، ژمارەى ونبووn + 1
ە.
خاڵە سەرەکییەکان:
- رێکخستنەوەى شوێن: ئێمە خۆى رێزەکە دەگۆڕین بۆ ئەوەى شوێنى زیادە بەکارنەهێنین.
- کارایى: هەم رێکخستنەوە و هەم پشکنینى کۆتاییەکەش کاتى دەگرێت، بۆ دڵنیابوون لە کارایى باش.
وێرژنی 2: زیادکردنى کارایى (لابردن گۆڕینەوەکانى زێدە)
function firstMissingPositive(nums: number[]): number {
const n = nums.length
let idx = 0
// رێکخستنەوەى ژمارەکان بۆ جێگەکانى دروستیان ئەگەر بکرێت
while (idx < n) {
const correctIdx = nums[idx] - 1
if (correctIdx >= 0 && correctIdx < n && nums[idx] !== nums[correctIdx]) {
// گۆڕینەوە بێ بەکارهێنانى گۆڕێکى کاتی
;[nums[idx], nums[correctIdx]] = [nums[correctIdx], nums[idx]]
} else {
idx++
}
}
// ناساندنى یەکەم ژمارەى پۆزەتیڤى ونبوو
for (let i = 0; i < n; i++) {
if (nums[i] !== i + 1) {
return i + 1
}
}
return n + 1
}
ڕونکردنەوە:
رێکخستنەوەى کارا:
- لەوپەرى
while
گۆڕینەوەى تەواوەکان بە راستەوخۆ دادەنرێنە جێگەکانى دروستیان (nums[idx] - 1
) تەنها ئەگەر ژمارەکە لە ناوچەى دروستى[1, n]
بێت و لە جێگەى دروستى خۆیدا نەبێت. - مەرجى
if
دڵنیادەکاتەوە کە ژمارە نە دروستەکان یان ئەوانەى لە جێگەى دروستیانن بێ گۆڕینەوەى پێویست لە بەرچاو لادەبرێن.
- لەوپەرى
پشکنینى ڕاستەوخۆى ڕیز:
- لە قۆناغى رێکخستنەوەدا، گۆڕینەوەکانى نە دروست و ئۆپەراسیۆنەکانى زێدە بە رێگەى پشکنینى ناوچە و بەهاى
nums[idx]
لە بەرچاو لادەبرێن.
- لە قۆناغى رێکخستنەوەدا، گۆڕینەوەکانى نە دروست و ئۆپەراسیۆنەکانى زێدە بە رێگەى پشکنینى ناوچە و بەهاى
گۆڕینەوەى پاراستنى بیرگە:
- بەکارهێنانى دەستکاریکردن (
[nums[idx], nums[correctIdx]] = [nums[correctIdx], nums[idx]]
) پێویستى بە گۆڕێکى کاتی لادەبات، کەمکردنەوەى بەکارهێنانى بیرگە.
- بەکارهێنانى دەستکاریکردن (
لەوپەرەکانى کەم:
- ئەلگۆریتەم تەنها دوو لەوپەرى خەتى بەکار دەهێنێت:
- یەکێک بۆ رێکخستنەوەى رێزەکە لە شوێنى خۆیدا.
- یەکێکى تر بۆ دۆزینەوەى یەکەم ژمارەى پۆزەتیڤى ونبوو.
- ئەلگۆریتەم تەنها دوو لەوپەرى خەتى بەکار دەهێنێت:
شیکردنەوەى پێکهاتە:
- پێکهاتەى کات:
- لەوپەرى
while
و لەوپەرىfor
هەردووکیان لە کاتى کاردەکەن، کە پێکهاتەى گشتیى کاتەکە دەکات.
- لەوپەرى
- پێکهاتەى شوێن:
- ئەلگۆریتەم لە شوێنى خۆیدا کاردەکات بێ بەکارهێنانى هیچ ساختارێکى داتای زیادە، بۆیە پێکهاتەى شوێنەکە ە.
هۆکارى ئەوەى کە ئەم کۆدە باشترینە:
- کارایى: لەوپەرى
while
ی باشترکراو دڵنیادەکاتەوە لە کەمترین ئۆپەراسیۆنى زێدە، زۆرترین خێرایی دەدات. - کارایى بیرگە: بەکارهێنانى گۆڕینەوەى لە شوێنى خۆیدا و لە بەرچاو لادانى گۆڕەکانى زیادە دڵنیادەبێت لە کەمترین بەکارهێنانى بیرگە.
وێرژنی 3: باشترین بۆ بیرگە (کەمترین بەکارهێنانى شوێن)
function firstMissingPositive(nums: number[]): number {
const n = nums.length
let idx = 0
while (idx < n) {
const correctIdx = nums[idx] - 1
if (correctIdx >= 0 && correctIdx < n && nums[idx] !== nums[correctIdx]) {
nums[idx] = nums[correctIdx]
nums[correctIdx] = correctIdx + 1
} else {
idx++
}
}
for (let idx = 0; idx < n; idx++) {
if (nums[idx] !== idx + 1) {
return idx + 1
}
}
return nums.length + 1
}
باشترین گۆڕانکارییەکانى بیرگە:
نوێکردنەوەى لە شوێنى خۆیدا لەگەڵ گۆڕە کاتییەکانى کەم:
- لە جیاتى بەکارهێنانى گۆڕێکى
temp
بۆ گۆڕینەوە، ئەم کۆدە بە راستەوخۆ رێزەکە دەگۆڕێت لەگەڵnums[idx] = nums[correctIdx]; nums[correctIdx] = correctIdx + 1
. - ئەمە پێویستى بە گۆڕێکى کاتی لادەبات، کەمکردنەوەى بەکارهێنانى بیرگە بە بڕێکى هەمیشەیی.
- لە جیاتى بەکارهێنانى گۆڕێکى
بەها کاتییەکانى کەمتر لە لەوپەر:
- کۆدەکە
correctIdx
بە راستەوخۆ لە لەوپەرەکەدا حساب دەکاتەوە، لە بەرچاو لادانى پێویستى بە گۆڕە ناوەندییەکانى دەرەوەى لۆجیکى سەرەکی. - دابەشکردنەکانى گۆڕە کەمتر واتەى بەکارهێنانى بیرگەى کەمترە لە هەر جارێکدا.
- کۆدەکە
لەوپەرێکى تەنها بۆ رێکخستنەوە:
- جیاواز لە کۆدى یەکەم کە مەرجەکانی تێکەڵ لە لەوپەرى
while
بەکار دەهێنێت، ئەم جێبەجێکردنە گۆڕینەوەکان یان پێشکەوتنەکان لە ڕیزێکى باشتر جێبەجێدەکات، کەمکردنەوەى قوڵیى ستاکى جێبەجێکردن و بەکارهێنانى بیرگە. - ساختارى لەوپەرەکە (
while
لەگەڵ زیادکردنى یەکێک یان رێکخستنەوە) ڕاستەوخۆترە، پێویستى بە بەهاکانى زیادە کەمترە.
- جیاواز لە کۆدى یەکەم کە مەرجەکانی تێکەڵ لە لەوپەرى
پشکنینەکانى زێدە نین:
- پشکنینەکان بۆ
correctIdx >= 0 && correctIdx < n && nums[idx] !== nums[correctIdx]
کورت و ڕوونن و لەبەرچاو لادانى ئۆپەراسیۆنەکانى پێویست ناکەن کە دەتوانن بە کاتی بیرگەى ستاک یان کەشی CPU بەکاربهێنن. - ئەمە لە بەرچاو لادانى پێویستى بە سەرچاوە زیادە بۆ ئۆپەراسیۆنەکان کە بەشداری لە ئەنجامدا ناکەن.
- پشکنینەکان بۆ
هۆکارى ئەوەى کە ئەمە لە بیرگەدا جیاوازى دەکات:
- کەمکردنەوەى پاراستنى کاتی: بە پشت نەبەستن بە گۆڕێکى
temp
و کەمکردنەوەى حسابەکانى ناوەندى، پێدانی بیرگە کەمترە. - جێبەجێکردنى باشترکراو: هەنگاوەکانى کەمتر و لۆجیکى سادەتر دەگۆڕێن بۆ بەکارهێنانى بیرگەى کەمتر لە هەر ئۆپەراسیۆنێک.
- بەکارهێنانى باشترى کەش: شێوازى دەستپێکردنى ڕاستەوخۆ و پێشبینی کراوى ئەلگۆریتەم بەکارهێنانى کەشى CPU باشتر دەکات، بە نێرراوە کەمکردنەوەى بەکارهێنانى بیرگە.
ئەم چارەسەرەى سەرنجدانی راستەوخۆى لە شوێنى خۆیدا، کەمترین بەکارهێنانى گۆڕ، و شێوازە کارایەکانى دەستپێکردنى بیرگە، باشترینە لەڕووى کارایى بیرگەوە. هەرچەندە پاراستنەکان هەمیشەیین ()، بەڵام بەسە بۆ تۆمارکردن لە پلاتفۆرمەکانی وەک LeetCode، بە تایبەت بۆ داتاکانى گەورە.
وێرژنی 4: شاکارى باشترکراو (گۆڕینەوەى لە شوێنى خۆیدا، بێ گۆڕى کاتی)
function firstMissingPositive(nums: number[]): number {
for (let i = 0; i < nums.length; i++) {
while (nums[i] !== i + 1) {
if (nums[i] <= 0 || nums[i] > nums.length || nums[i] === nums[nums[i] - 1]) {
break
}
const temp = nums[i]
nums[i] = nums[temp - 1]
nums[temp - 1] = temp
}
}
for (let i = 0; i < nums.length; i++) {
if (nums[i] !== i + 1) {
return i + 1
}
}
return nums.length + 1
}
ئەم وێرژنى کۆتاییە هەم کارایى باشترین و هەم کەمترین بەکارهێنانى بیرگە بە دەست دەهێنێت بە گۆڕینەوەى شێوازى لە شوێنى خۆیدا بێ گۆڕێکى کاتی. پێکهاتەى کات ئێستا بەتەواوەتى ە، و پێکهاتەى شوێن ە، هەموو پێویستییەکان پڕ دەکاتەوە. لەڕووى ماتماتیکییەوە، ئێمە جۆرێک لە گۆڕینەوەى چەرخەیی لە ناو رێزەکەدا ئەنجام دەدەین بۆ دانانى تەواوەکان لە جێگەى "دروستى" خۆیان.
بە زیادکردنى پشکنینێک (nums[i] === nums[nums[i] - 1]
), ئێمە گۆڕینەوەکانى پێویست لە بەرچاو لادەدەین. ئەمە بە شێوەیەکى بەرچاو کارایى باشتر دەکات، کە پێکهاتەى کات نزیک دەکاتەوە لە ی پێویست.
جیاوازییە سەرەکییەکان لە جێبەجێکردن:
لە بەرچاو لادانى گۆڕینەوەکانى زێدە:
- کۆدى پێشکەشکراو بە ڕوونى دەپشکنێت ئایا
nums[i] === nums[nums[i] - 1]
پێش ئەنجامدانی گۆڕینەوە. ئەمە لە بەرچاو لادانى گۆڕینەوەکانى پێویست لە کاتى ئامادەبوونى ژمارەکە لە جێگەى دروستى یان دووبارەبوونەوەکان. - لە جێبەجێکردنى یەکەم دا، ئەم پشکنینە لابراوە، کە دەتوانێت ببێتە هۆى گۆڕینەوە زێدەکان هەتا لە کاتى پێویست نەبوونیشدا. هەر گۆڕینەوەیەکى زیادە هەڵواسراو زیاد دەکات، بە تایبەت بۆ رێزەکانى گەورە.
- کۆدى پێشکەشکراو بە ڕوونى دەپشکنێت ئایا
بەراوردکردنى ڕاستەوخۆى ڕیز:
- کۆدى پێشکەشکراو
while (nums[i] !== i + 1)
بەکار دەهێنێت بۆ دڵنیابوون لەوەى کە ژمارەیەک بە دووبارە گۆڕینەوە دادەنرێتە جێگەى دروستى خۆیدا تا جێگیر دەبێت یان مەرجێکى نە دروست روودەدات. ئەمە لە بەرچاو لادانى دووبارەکردنەوەکانى لەوپەر. - کۆدى یەکەم بە ڕوونى ژمارەکە بە ڕیزى مەبەستکراوى خۆى لە ناو مەرجى لەوپەرەکەدا بەراورد ناکات. دەتوانێت ئۆپەراسیۆنى زیاتر ئەنجام بدات لە حاڵەتەکانى کە ژمارەکان پێویستیان بە جوڵەی کەمتر هەیە.
- کۆدى پێشکەشکراو
پشکنینەکانى مەرجى باشترکراو:
- بە تێکەڵکردنى مەرجەکان لە یەک بەشى
if
(نمونە،nums[i] <= 0 || nums[i] > nums.length || nums[i] === nums[nums[i] - 1]
), کۆدەکە لەبەرچاو لادانى زیادە لە پشکنین یان حسابەکان.
- بە تێکەڵکردنى مەرجەکان لە یەک بەشى
هۆکارى ئەمە لە LeetCode:
یەکسانیى کاتى جێبەجێکردن:
- پێوانەى کاتى جێبەجێکردنى LeetCode دەتوانێت هەستیار بێت بەرامبەر ئۆپەراسیۆنەکانى زیادە، وەک گۆڕینەوەکانى زێدە یان بەراوردەکانى زیادە.
- کۆدى پێشکەشکراو ئەم ئۆپەراسیۆنانە کەم دەکاتەوە، بۆ کاتێکى خێراتر بە مامناوەندى.
کارایى کەش:
- گۆڕینەوەکانى کەمتر و لۆجیکى سادەترى لەوپەر ئەنجامێکى باشتر لە بەکارهێنانى کەشى CPU دەدات. پروسێسەرە نوێکان سوود لە شێوازەکانى دەستپێکردنى پێشبینی کراو و ڕاستەوخۆ وەردەگرن، کە کۆدى پێشکەشکراو پیشاندەدات.
ئەنجامەکان
ئەمە کورتکراوەکەيە لە شێوازى جەدول:
هەوڵ | کاتى جێبەجێکردن | بەکارهێنانى بیرگە | تێبینییەکان |
---|---|---|---|
4 (باشترین) | 1 ms | 58.8 MB | باشترین هاوسەنگیى کارایى و بیرگە. |
3 (باشترین بیرگە) | 2 ms | 58.5 MB | کەمێک هێواشتر بەڵام بەکارهێنانى بیرگەى کەمتر. |
2 (باشترین کارایى) | 1 ms | 58.9 MB | کاتى جێبەجێکردنى خێراتر. |
1 (هەوڵى سەرەتایی) | 3 ms | 59 MB | هێواشتر و بەکارهێنانى بیرگەى زۆرتر. |
ئەم جەدولە جیاوازییەکان و باشترینى چارەسەرە کۆتاییەکە دەخاتە ڕوو.
کورتکراوەکە ئاماژە بەوە دەکات کە هەوڵى باشترین کارایى و بیرگە لە ڕاستیدا باشترینە، کە دەست دەکات بە:
- 1 ms کاتى جێبەجێکردن: هاوتاى باشترین ئەنجام لەڕووى کارایى.
- 58.9 MB بەکارهێنانى بیرگە: کەمێک زیاتر لە کۆپى "باشترین بیرگە" (58.5 MB) بەڵام کەمتر لە هەوڵەکانى تر.
شیکردنەوە:
کاتى جێبەجێکردن:
- 1 ms کاتى جێبەجێکردن پیشاندەدات کە رێبازى باشترکراو پشکنینەکانى زێدە و گۆڕینەوەکانى پێویست لە بەرچاو لادەدات.
- پێکهاتەى کاتى یەکسانى دڵنیایی لە گەشەپێدان بۆ داتاکانى گەورە دەدات.
بیرگە:
- 58.9 MB پێشبڕکێکارە، پیشاندەدات کە پێدانی بیرگە نزمە سەرەرایى جێبەجێکردنى خێرا. ئەم زیادبوونە بچووکە لە "باشترین بیرگە" (58.5 MB) دەتوانێت بەهۆى جیاوازی لە دەستکاریکردن یان باشترکردنەکانى مۆتۆر بێت.
جیاوازییەکان:
- چارەسەرەکەى "باشترین بیرگە" کەمێک قوربانیى کاتى جێبەجێکردن دەدات بۆ بەکارهێنانى بیرگەى کەمتر.
- چارەسەرەکەى "باشترین کارایى" زیاتر گرنگیى بە خێرایی دەدات بەڵام بەکارهێنانى بیرگەى کەمێک زیاترە.
کۆتایی:
چارەسەرە باشترکراوەکە هاوسەنگییەکى باش دەدات:
- 1 ms کاتى جێبەجێکردن بە خێرایی هاوتاى باشترین کۆدە.
- 58.9 MB بەکارهێنانى بیرگە نزیکە لە باشترین ئەنجامى بیرگە، بە هەڵواسراوێکى بێ مانا.
ئەمە هەڵبژاردنێکى تەواوە، بەتایبەت بۆ حاڵەتەکانى کە هەم کارایى و هەم بیرگە گرنگن.
بنەماکانى ماتماتیکی: گۆڕینەوە چەرخەییەکان و بنەماى کەلەکە
بیرۆکەى سەرەکی دەسوڕێتەوە دەوروبەرى بیرۆکەى گۆڕینەوە چەرخەییەکان. ئێمە ئامانجمان دروستکردنى چەرخێکە کە هەر ژمارەیەکى لە ڕیزى دادەنرێت. لەوپەرى while
بە شێوەیەکى کارا لەم چەرخانەدا دەگەڕێت، دڵنیادەکاتەوە هەر تەواوێک جێگەى دیاریکراوى خۆى دەدۆزێتەوە.
بنەماى کەلەکە بە شێوەیەکى نەبینراو رۆڵ دەبینێت لێرەدا. چونکە ئێمە جێگەى گونجاو هەین (ڕیزەکانى بۆ ) و بەدوای ژمارەیەکى پۆزەتیڤى ونبووداین لە ناوچەى ، ئەگەر هەموو ژمارەکان لە 1 بۆ ئامادە بن، ژمارەى ونبوو دەبێت بێت.
هەڵواسراوەکە بەردەوامە...
دڵسۆزییەکەم بۆ LeetCode 41 ماوەتەوە. بەردەوام لەگەڵ باشترکردنى زیاتر و تێگەیشتنى قوڵتر دەگەڕێم. لەگەڵم بەشداری بکە لەم گەشتەدا! بیرەکانتان، چارەسەرەکانى تایبەتى خۆتان، و با لەگەڵ یەکتر لێکۆڵینەوە بکەین لە هاوبەندیی جوانى ماتماتیک و ئەلگۆریتمەکان.