Giới thiệu
Xóa các phần tử trong mảng có chỉ số từ L đến R (inclusive). Dịch chuyển các phần tử còn lại về đầu mảng.
Ví dụ
Mảng: [1,2,3,4,5,6,7,8,9], L=1, R=6
Xóa chỉ số 1..6: phần tử 2,3,4,5,6,7
Còn lại: [1, 8, 9] (chỉ số 0, 7, 8)
Mã nguồn hoàn chỉnh
#include <bits/stdc++.h>
using namespace std;
int deleteElementsInRange(int arr[], int n, int l, int r) {
int newIndex = 0;
for (int i = 0; i < n; i++) {
// Giữ phần tử nếu KHÔNG trong khoảng [l, r]
if (i < l || i > r) {
arr[newIndex] = arr[i];
newIndex++;
}
}
return newIndex; // Độ dài mảng mới
}
int main() {
int n = 9, l = 1, r = 6;
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int newLen = deleteElementsInRange(arr, n, l, r);
cout << "Mang sau xoa: ";
for (int i = 0; i < newLen; i++) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
Kết quả chạy chương trình
Mang sau xoa: 1 8 9
Phân tích độ phức tạp
- Thời gian: O(n) - duyệt mảng 1 lần
- Không gian: O(1) - xử lý tại chỗ (in-place)
Sửa lỗi logic code gốc
Code gốc: if (i <= l || i >= r) → Sai! Giữ i≤l (bao gồm l) và i≥r (bao gồm r).
Đúng: if (i < l || i > r) → Giữ phần tử NGOÀI khoảng [l, r].
Cải tiến: Hỗ trợ vector
vectordeleteRangeVector(vector arr, int l, int r) { vector result; for (int i = 0; i < arr.size(); i++) { if (i < l || i > r) result.push_back(arr[i]); } return result; }
Kết luận
Kỹ thuật two-pointer (read index i, write index newIndex) để xóa phần tử mảng tại chỗ. Cần chú ý điều kiện giới hạn đúng.