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)
浙公网安备 33010602011771号