ستساعدك المقالة التالية: قالب مقابلة Leetcode Coding لأنماط الكود الشائعة
مؤشرين: مدخل واحد ، ونهايات متقابلة
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public int fn (int[] arr) {int left = 0 ؛ int right = arr.length – 1 ؛ عدد الجواب = 0 ؛ بينما (يسار <يمين) {// افعل بعض المنطق هنا مع اليسار واليمين إذا (CONDITION) {left ++؛ } else {right--؛ }} عودة الجواب؛ } |
مؤشرين: مدخلين ، استنفاد كلاهما
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | public int fn (int[] arr1 ، كثافة العمليات[] arr2) {int i = 0 ، j = 0 ، الجواب = 0 ؛ while (i |
نافذة منزلقة
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public int fn (int[] arr) {int left = 0 ، الجواب = 0 ، تيار = 0 ؛ لـ (int right = 0؛ right |
بناء مجموع البادئة
1 2 3 4 5 6 7 8 9 10 | كثافة العمليات العامة[] fn (int[] arr) {int[] البادئة = int[arr.length]؛ بادئة[0] = ار[0]؛ لـ (int i = 1 ؛ i |
بناء سلسلة فعالة
1 2 3 4 5 6 7 8 | سلسلة عامة fn (char[] arr) {StringBuilder sb = new StringBuilder () ، لـ (char c: arr) {sb.append (c) ؛ } return sb.toString ()؛ } |
في JavaScript ، تُظهر المقارنة المعيارية أن التسلسل مع + = أسرع من استخدام .join ().
القائمة المرتبطة: مؤشر سريع وبطيء
1 2 3 4 5 6 7 8 9 10 11 12 13 | public int fn (ListNode head) {ListNode slow = head ؛ ListNode fast = الرأس ؛ عدد الجواب = 0 ؛ while (fast! = null && fast.next! = null) {// do logic slow = slow.next؛ سريع = fast.next.next ؛ } عودة الجواب؛ } |
عكس قائمة مرتبطة
1 2 3 4 5 6 7 8 9 10 11 12 | ListNode العامة fn (رأس ListNode) {ListNode Current = head ؛ ListNode prev = فارغ ؛ while (current! = null) {ListNode nextNode = current.next؛ Current.next = prev ؛ سابق = تيار ؛ تيار = nextNode ؛ } عودة prev؛ } |
ابحث عن عدد من المصفوفات الفرعية التي تناسب معيارًا دقيقًا
1 2 3 4 5 6 7 8 9 10 11 12 13 | public int fn (int[] arr، int k) {Map |
مكدس متزايد رتيب
يمكن تطبيق نفس المنطق للحفاظ على قائمة انتظار رتيبة.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public int fn (int[] arr) {Stack |
الشجرة الثنائية: DFS (تكراري)
1 2 3 4 5 6 7 8 9 10 11 | public int dfs (TreeNode root) {if (root == null) {return 0؛ } int ans = 0 ؛ // do logic dfs (root.left) ؛ dfs (root.right) ؛ عودة الجواب } |
الشجرة الثنائية: DFS (تكراري)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public int dfs (TreeNode root) {Stack |
الشجرة الثنائية: BFS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public int fn (TreeNode root) {Queue |
الرسم البياني: DFS (تكراري)
بالنسبة لقوالب الرسم البياني ، افترض أن العقد مرقمة من 0 إلى n – 1 وأن الرسم البياني معطى كقائمة مجاورة. اعتمادًا على المشكلة ، قد تحتاج إلى تحويل الإدخال إلى قائمة مجاورة مكافئة قبل استخدام القوالب.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | تعيين |
الرسم البياني: DFS (تكراري)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public int fn (int[][] الرسم البياني) {Stack |
الرسم البياني: BFS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public int fn (int[][] الرسم البياني) {Queue |
ابحث عن أفضل عناصر k باستخدام الكومة
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | كثافة العمليات العامة[] fn (int[] arr، int k) {PriorityQueue |
بحث ثنائي
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public int fn (int[] arr، int target) {int left = 0؛ int right = arr.length – 1 ؛ بينما (يسار <= يمين) {int mid = left + (يمين - يسار) / 2 ؛ إذا (arr[mid] == الهدف) {// فعل شيء يعود في منتصفه ؛ } إذا (arr[mid] > الهدف) {right = mid – 1؛ } آخر {يسار = منتصف + 1 ؛ }} // left هي نقطة الإدراج التي ترجع إلى اليسار ؛ } |
بحث ثنائي: عناصر مكررة ، أقصى اليسار نقطة إدخال
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public int fn (int[] arr، int target) {int left = 0؛ int right = arr.length ؛ بينما (يسار <يمين) {int mid = left + (يمين - يسار) / 2 ؛ إذا (arr[mid] > = الهدف) {right = mid} وإلا {left = mid + 1؛ }} رجوع يسار؛ } |
بحث ثنائي: عناصر مكررة ، نقطة إدخال في أقصى اليمين
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public int fn (int[] arr، int target) {int left = 0؛ int right = arr.length ؛ بينما (يسار <يمين) {int mid = left + (يمين - يسار) / 2 ؛ إذا (arr[mid] > الهدف) {right = mid؛ } آخر {يسار = منتصف + 1 ؛ }} رجوع يسار؛ } |
بحث ثنائي: عن مشاكل الجشع
إذا كنت تبحث عن حد أدنى:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public int fn (int[] arr) {int left = MINIMUM_POSSIBLE_ANSWER ، int right = MAXIMUM_POSSIBLE_ANSWER ، بينما (يسار <= يمين) {int mid = left + (يمين - يسار) / 2 ؛ إذا (تحقق (منتصف)) {يمين = منتصف - 1 ؛ } آخر {يسار = منتصف + 1 ؛ }} رجوع يسار؛ } التحقق المنطقي العام (int x) {// يتم تنفيذ هذه الوظيفة اعتمادًا على مشكلة إرجاع BOOLEAN ؛ } |
إذا كنت تبحث عن حد أقصى:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public int fn (int[] arr) {int left = MINIMUM_POSSIBLE_ANSWER ، int right = MAXIMUM_POSSIBLE_ANSWER ، بينما (يسار <= يمين) {int mid = left + (يمين - يسار) / 2 ؛ إذا (تحقق (منتصف)) {يسار = منتصف + 1 ؛ } آخر {right = mid - 1؛ }} حق العودة ؛ } التحقق المنطقي العام (int x) {// يتم تنفيذ هذه الوظيفة اعتمادًا على مشكلة إرجاع BOOLEAN ؛ } |
التراجع
1 2 3 4 5 6 7 8 9 10 11 12 13 | public int backtrack (STATE current، OTHER_ARGUMENTS …) {if (BASE_CASE) {// قم بتعديل الإجابة بإرجاع 0 ؛ } int ans = 0 ؛ لـ (ITERATE_OVER_INPUT) {// تعديل الحالة الحالية ans + = تراجع (تيار ، OTHER_ARGUMENTS …) // التراجع عن تعديل الحالة الحالية}} |
البرمجة الديناميكية: حفظ الذاكرة من أعلى إلى أسفل
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | الخريطة |
بناء ثلاثي
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | // note: يعد استخدام فئة ضروريًا فقط إذا كنت تريد تخزين البيانات في كل عقدة. // خلاف ذلك ، يمكنك تنفيذ trie باستخدام خرائط التجزئة فقط. class TrieNode {// يمكنك تخزين البيانات في العقد إذا كنت ترغب في بيانات int ؛ تعيين الأطفال <حرف ، TrieNode> ؛ TrieNode () {this.children = new HashMap <> ()؛ }} العامة TrieNode buildTrie (String[] الكلمات) {TrieNode root = new TrieNode () ؛ لـ (String word: Words) {TrieNodeurr = root؛ لـ (char c: word.toCharArray ()) {if (! } Current =urr.children.get (c) ؛ } // في هذه المرحلة ، لديك كلمة كاملة في cur // يمكنك إجراء المزيد من المنطق هنا لإعطاء سمة الحالية الحالية إذا كنت تريد} عودة الجذر ؛ } |