حل مشكلة Two Sum باستخدام البرمجة مع أمثلة في Python، Java، و C

Amine
16/09/2024

1. مقدمة عن المشكلة

وصف المشكلة:
مشكلة Two Sum هي مشكلة شائعة في البرمجة، حيث يُطلب منك العثور على عنصرين في مصفوفة أعداد صحيحة بحيث يكون مجموعهما مساويًا لمبلغ محدد.

حالة استخدام:
تُستخدم هذه المشكلة في العديد من التطبيقات، مثل تحديد الأزواج في قواعد البيانات التي تحقق شرطًا معينًا، أو العثور على مجموعات من الأرقام التي تلبي شرطًا في تحليل البيانات.

المدخلات والمخرجات:

  • المدخلات: مصفوفة من الأعداد الصحيحة nums ورقم صحيح target.
  • المخرجات: فهارس العنصرين اللذين يكون مجموعهما مساويًا لـ target.

2. شرح تعليمي للحل

هناك طرق مختلفة لحل مشكلة Two Sum. الحل الأمثل يعتمد على استخدام هاش ماب (HashMap) لتحقيق تعقيد زمني O(n)، حيث n هو عدد العناصر في المصفوفة.

  • نقوم بإنشاء هاش ماب لتخزين القيم المطلوبة لكل عنصر (target – nums[i]) والفهرس الحالي.
  • أثناء المرور عبر المصفوفة، نتحقق مما إذا كان العنصر الحالي موجودًا بالفعل في الهام ماب.
  • إذا وجدنا العنصر المطلوب في الهام ماب، نُرجع الفهارس الحالية والمخزنة.

تعقيد الوقت:

  • O(n)، حيث n هو عدد العناصر في المصفوفة.

تعقيد المساحة:

  • O(n) لاستخدام الهام ماب لتخزين العناصر المطلوبة.

3. الحل في Python

def two_sum(nums, target):
    num_map = {}

    for i, num in enumerate(nums):
        complement = target - num
        if complement in num_map:
            return [num_map[complement], i]
        num_map[num] = i

    return []

# استخدام المثال
nums = [2, 7, 11, 15]
target = 9
print("الفهارس:", two_sum(nums, target))

4. الحل في Java

import java.util.HashMap;

public class TwoSum {

    public static int[] twoSum(int[] nums, int target) {
        HashMap<Integer, Integer> numMap = new HashMap<>();
        
        for (int i = 0; i < nums.length; i++) {
            int complement = target - nums[i];
            if (numMap.containsKey(complement)) {
                return new int[] { numMap.get(complement), i };
            }
            numMap.put(nums[i], i);
        }
        
        throw new IllegalArgumentException("No two sum solution");
    }

    public static void main(String[] args) {
        int[] nums = {2, 7, 11, 15};
        int target = 9;
        int[] result = twoSum(nums, target);
        System.out.println("الفهارس: [" + result[0] + ", " + result[1] + "]");
    }
}

5. الحل في C

#include <stdio.h>
#include <stdlib.h>

int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
    int* result = (int*)malloc(2 * sizeof(int));
    *returnSize = 2;

    for (int i = 0; i < numsSize; i++) {
        for (int j = i + 1; j < numsSize; j++) {
            if (nums[i] + nums[j] == target) {
                result[0] = i;
                result[1] = j;
                return result;
            }
        }
    }

    return NULL;
}

int main() {
    int nums[] = {2, 7, 11, 15};
    int target = 9;
    int returnSize;
    int* result = twoSum(nums, 4, target, &returnSize);
    if (result != NULL) {
        printf("الفهارس: [%d, %d]\\n", result[0], result[1]);
        free(result);
    } else {
        printf("لا يوجد حل.\\n");
    }
    return 0;
}

التعليقات

اترك تعليقاً