Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Xóa phần tử mảng trong khoảng chỉ số [L, R] trong C++

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

vector deleteRangeVector(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.