3道数组OJ题

1. 移除元素

题目链接 要求时间复杂度为O(N), 空间复杂度为O(1)

解法: 双指针

int removeElement(int* nums, int numsSize, int val){
    int src = 0, dst = 0;
    while (numsSize--)
    {
        if (nums[src] != val)
        {
            nums[dst] = nums[src];
            dst++, src++;
        }
        else
        {
            src++;
        }
    }
    return dst;
}

复杂度分析

时间复杂度O(N),  N为数据个数, 在这道题中语句执行的次数可以等于遍历数组的次数

空间复杂度O(1), 两个变量src,dst

 

2. 删除有序数组的重复项

题目链接 要求时间复杂度为O(N), 空间复杂度为O(1)

解法: 双指针

int removeDuplicates(int* nums, int numsSize) {
    int cur = 1, prev = 0;
    while (cur < numsSize)
    {
        if (nums[cur] == nums[prev])
        {
            cur++;
        }
        else
        {
            prev++;
            nums[prev] = nums[cur];
            cur++;
        }
    }
    return prev+1;
}

 

3. 合并两个有序数组

题目链接  要求时间复杂度为O(N), 空间复杂度为O(1)

解法: 逆向三指针

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
    int end1 = m-1, end2 = n-1, dst = m+n-1;
    while (end1 >= 0 && end2 >= 0)
    {
        if (nums2[end2] > nums1[end1])
        {
            nums1[dst] = nums2[end2];
            dst--, end2--;
        }
        else 
        {
            nums1[dst] = nums1[end1];
            dst--, end1--;
        }
    }
    while (end2 >= 0)
    {
        nums1[dst] = nums2[end2];
        dst--, end2--;
    }
}

复杂度分析

语句执行的大概次数等于m+n, 所以时间复杂度为O(N)

创建了3个变量, 空间复杂度为O(1)

posted @ 2023-03-18 09:34  许木101  阅读(30)  评论(0)    收藏  举报