سوال 167

عنوان سوال : Two Sum II - Input Array Is Sorted

  • متوسط
  • جستجو باینری
  • دو اشاره گر
  • آرایه

یک آرایهٔ ۱-ایندکسی از اعداد صحیح به نام numbers داده شده است که از قبل به‌صورت صعودی (non-decreasing) مرتب شده است.
هدف این است که دو عدد پیدا کنیم که مجموعشان برابر با مقدار target باشد.
این دو عدد باید numbers[index1] و numbers[index2] باشند، به‌طوری که:

  • 1 <= index1 < index2 <= numbers.length
  • فقط یک جواب معتبر وجود دارد.
  • اجازه ندارید از یک عنصر بیش از یک‌بار استفاده کنید.
  • الگوریتم باید تنها از فضای کمکی ثابت (O(1)) استفاده کند.

در نهایت باید اندیس‌ها را با یک واحد اضافه به‌صورت [index1, index2] برگردانید.


مثال:

ورودی:
numbers = [2,7,11,15]
target = 9

خروجی:
[1,2]

توضیح:
2 + 7 = 9
پس اندیس‌ها (با احتساب ۱-ایندکس بودن): [1, 2]


محدودیت‌ها:

  • 2 <= numbers.length <= 3 * 10^4
  • -1000 <= numbers[i] <= 1000
  • آرایه به‌صورت صعودی مرتب شده است.
  • -1000 <= target <= 1000
  • دقیقاً یک پاسخ معتبر وجود دارد.

راه حل

public int[] TwoSum(int[] numbers, int target)
{
    var left = 0;
    var right = numbers.Length - 1;

    while (left < right)
    {
        var sum = numbers[left] + numbers[right];

        if (sum > target)
        {
            right -= 1;
        }
        else if (sum < target)
        {
            left += 1;
        }
        else
        {
            return [left + 1, right + 1];
        }
    }

    return [];
}

کپی رایت © mhkarami97