系列文章目录
🎈 🎈 我的优快云主页:OTWOL的主页,欢迎!!!👋🏼👋🏼
🎉🎉我的C语言初阶合集:C语言初阶合集,希望能帮到你!!!😍 😍
🔍🔍我的C语言进阶合集:我的C语言进阶合集,期待你的点击!!!🌈🌈
🎉🎉我的数据结构与算法合集:数据结构与算法合集,点进去看看吧!!! 🎊🎊
前言
各位博友,大家好!👋 今天为大家送上静态顺序表【数组】有关的三道OJ题的总结。🔍
一、删除有序数组中的重复项
下面是该题的链接🔗
解题思路
通过 双指针法 来移除数组中的重复元素。
src
指针用于遍历数组,dst
指针用于记录不重复元素的位置。
如果src
指向的元素与dst
指向的元素不同,则将src
的元素复制到dst + 1
的位置,并移动dst
指针。
这样,所有不重复的元素都会被移动到数组的前部。
最后返回dst + 1
,即数组中不重复元素的数量。
这种方法的时间复杂度为O(numsSize
),空间复杂度为O(1)。
代码展示
int removeDuplicates(int* nums, int numsSize)
{
// 如果数组为空或只有一个元素,则无需去重,直接返回数组大小
if (numsSize == 0 || numsSize == 1)
{
return numsSize;
}
int src = 1; // src 是源索引,从数组的第二个元素开始
int dst = 0; // dst 是目标索引,初始化为数组的第一个元素
// 遍历数组,从第二个元素开始
while(src < numsSize)
{
// 如果当前元素与目标索引处的元素不同,则将当前元素复制到目标索引的下一个位置
if(nums[src] != nums[dst])
{
nums[++dst] = nums[src]; // 复制元素,并更新目标索引
}
++src; // 移动源索引到下一个元素
}
// 数组中唯一元素的个数返回,dst 是最后一个唯一元素的索引,所以返回 dst + 1
return (dst + 1);
}
二、移除元素
下面是该题的链接🔗,想尝试的博友,点击下面的链接就能大展身手了哦🥳。
解题思路
通过一次遍历数组来移除所有等于
val
的元素。
src
指针用于遍历数组,dst
指针用于记录不等于val
的元素的位置。
如果src
指向的元素不等于val
,则将该元素复制到dst
指向的位置,并移动dst
指针。
这样,所有不等于val
的元素都会被移动到数组的前部。
最后返回dst
,即数组中不等于val
的元素的数量。
这种方法的时间复杂度为O(numsSize
),空间复杂度为O(1)。
代码展示
int removeElement(int* nums, int numsSize, int val)
{
int src = 0; // src 是源索引,用于遍历数组
int dst = 0; // dst 是目标索引,用于记录不等于 val 的元素的位置
// 遍历数组中的每个元素
while(src < numsSize)
{
// 如果当前元素不等于 val,则将其复制到 dst 指向的位置
if(nums[src] != val)
{
nums[dst] = nums[src]; // 复制元素
++dst; // 移动目标索引到下一个位置
}
++src; // 移动源索引到下一个元素
}
// 返回 dst,即数组中不等于 val 的元素的数量
return dst;
}
三、合并两个有序数组
下面是该题的链接🔗
解题思路
首先比较
nums1
和nums2
中较大的元素,并将较大的元素放到nums1
的末尾。
如果nums2
中还有剩余元素,将它们全部拷贝到nums1
的前面。
合并过程是从后向前进行的,这样可以避免覆盖nums1
中未处理的元素。
这种方法的时间复杂度为O(m+n
),空间复杂度为O(1)。
代码展示
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
// end1 是 nums1 中从后向前遍历的索引,m 是 nums1 中已经排序部分的元素个数
int end1 = m - 1;
// end2 是 nums2 中从后向前遍历的索引,n 是 nums2 中元素的个数
int end2 = n - 1;
// dst 是 nums1 中从后向前遍历的索引,用于存放合并后的元素
int dst = m + n - 1;
// 合并两个数组,直到 end1 或 end2 遍历完
while((end1 >= 0) && (end2 >= 0))
{
// 如果 nums1 中的当前元素大于 nums2 中的当前元素,则将 nums1 中的元素放入 nums1 的末尾,并移动指针
if(nums1[end1] > nums2[end2])
{
nums1[dst--] = nums1[end1--];
}
else
{
// 否则,将 nums2 中的元素放入 nums1 的末尾,并移动指针
nums1[dst--] = nums2[end2--];
}
}
// 如果 nums2 中还有剩余元素,则将它们全部拷贝到 nums1 的前面
while(end2 >= 0)
{
nums1[dst--] = nums2[end2--];
}
}
END
每天都在学习的路上!
On The Way Of Learning