Đề bài
Cho một mảng số nguyên numbers đã được sắp xếp theo thứ tự không giảm, tìm hai số sao cho tổng của chúng bằng một số mục tiêu target. Hãy trả về chỉ số của hai số đó, index1 và index2, với điều kiện 1 <= index1 < index2 <= numbers.length.
Trả về một mảng chứa chỉ số của hai số, [index1, index2], với các chỉ số được tăng thêm 1.
Yêu cầu: Giải pháp của bạn phải sử dụng không gian phụ chỉ cố định.
Ví dụ 1:
Đầu vào: numbers = [2,7,11,15], target = 9
Đầu ra: [1,2]
Giải thích: Tổng của 2 và 7 là 9. Do đó, index1 = 1, index2 = 2. Chúng ta trả về [1, 2].
Ví dụ 2:
Đầu vào: numbers = [2,3,4], target = 6
Đầu ra: [1,3]
Giải thích: Tổng của 2 và 4 là 6. Do đó, index1 = 1, index2 = 3. Chúng ta trả về [1, 3].
Ví dụ 3:
Đầu vào: numbers = [-1,0], target = -1
Đầu ra: [1,2]
Giải thích: Tổng của -1 và 0 là -1. Do đó, index1 = 1, index2 = 2. Chúng ta trả về [1, 2].
Ràng buộc:
2 <= numbers.length <= 30,000
-1000 <= numbers[i] <= 1000
numbers đã được sắp xếp theo thứ tự không giảm.
-1000 <= target <= 1000
Các bài kiểm tra được tạo ra sao cho có chính xác một giải pháp.
Cách làm
#include <iostream>
using namespace std;
void timHaiSo(int numbers[], int n, int target) {
int trai = 0;
int phai = n - 1;
while (trai < phai) {
int tong = numbers[trai] + numbers[phai];
if (tong == target) {
cout << "[" << trai + 1 << "," << phai + 1 << "]" << endl;
return;
} else if (tong < target) {
trai++;
} else {
phai--;
}
}
}
int main() {
int numbers[] = {2, 7, 11, 15};
int n = sizeof(numbers) / sizeof(numbers[0]);
int target = 9;
timHaiSo(numbers, n, target);
return 0;
}