leecode练习-数组-3.9
练习一:合并两个有序数组
1. 题目
2. 思路
- 将遍历后的数组存储在临时数组sorted中;
- 使用双指针 p1、p2同时遍历两个数组;
- 当p1等于nums1的size时,p1排序完成,从nums2中取元素;
- 当p2等于nums2的size时,p2排序完成,从nums1中取元素;
- 当p1、p2没遍历完,就比较两个数的大小,取较小的数;
- 将当前比较出的最小值放入sorted数组的当前位置,并递增index
- 将sorted拷贝到num1并复制数组
3. 代码
#include <vector>
class Solution
{
public:
void merge(std::vector<int>& nums1, int m, std::vector<int>& nums2, int n)
{
int p1 = 0, p2 = 0; // 双指针分别指向两个数组的起始位置
std::vector<int> sorted; // 存储排序完成后的数组
sorted.resize(m + n); // 调整sorted的大小以容纳m+n个元素
int cur; // 存储当前比较出的值
int index = 0; // 新增索引用于记录sorted的位置
// 遍历两个数组并排序
while (p1 < m || p2 < n)
{
// 当 p1 == m 时,nums1的所有元素已经处理完毕,从nums2中取元素
if (p1 == m)
cur = nums2[p2++]; // 取nums2中的当前元素,并移动p2指针
// 当 p2 == n 时,nums2的所有元素已经处理完毕,从nums1中取元素
else if (p2 == n)
cur = nums1[p1++]; // 取nums1中的当前元素,并移动p1指针
// p1、p2都没遍历完,就比较两个数的大小
else if (nums1[p1] < nums2[p2])
cur = nums1[p1++]; // 如果nums1的当前元素较小,则取nums1的当前元素,并移动p1指针
else
cur = nums2[p2++]; // 否则取nums2的当前元素,并移动p2指针
sorted[index++] = cur; // 将当前比较出的最小值放入sorted数组的当前位置,并递增index
}
// 将sorted拷贝到num1
for (int i = 0; i < m + n; ++i)
{
nums1[i] = sorted[i]; // 将sorted数组中的每个元素复制到nums1中
}
4. 错误总结
- 忘记包含头文件
- vector中部分函数使用方法不熟悉,需要复习
练习2:移除元素
1. 题目
2. 思路
初始化:
- 获取原数组
nums
的大小size
。 - 创建一个与原数组大小相同的临时数组
erased
,用于存储不等于val
的元素。 - 初始化一个计数器
k
,用于记录新数组的有效长度。
遍历原数组:
- 使用一个循环遍历原数组
nums
中的每一个元素。 - 对于每个元素,检查其是否等于
val
。
条件判断:
- 如果当前元素不等于
val
,将其赋值给临时数组erased
中的第k
个位置,并将k
增加 1。 - 如果当前元素等于
val
,则跳过该元素,继续下一个元素的检查。
替换原数组:
- 使用
swap
方法将原数组nums
的内容替换为临时数组erased
的内容。
返回结果:
- 返回计数器
k
的值,表示移除后的数组的新长度。
3. 代码
#include <vector>
class Solution
{
public:
int removeElement(std::vector<int>& nums, int val)
{
int slow = 0; // 慢指针,指向新数组的末尾位置
for (int fast = 0; fast < nums.size(); ++fast) // 快指针,遍历原数组
{
if (nums[fast] != val) // 如果当前元素不等于目标值val
{
nums[slow] = nums[fast]; // 将当前元素放到慢指针的位置
++slow; // 增加慢指针的位置
}
}
return slow; // 返回新数组的有效长度
}
};
4. 错误总结
- 一次过
练习3:删除有序数组的重复项
1. 题目
2. 思路
-
初始化:
- 首先检查数组是否为空。如果为空,直接返回 0。
- 使用一个慢指针
j
,初始值为 0,用于记录新数组的末尾位置。
-
遍历数组:
- 使用一个快指针
i
,从 0 开始遍历数组nums
。
- 使用一个快指针
-
条件判断:
- 对于每个元素
nums[i]
,检查其是否与nums[j]
相等。 - 如果
nums[i]
不等于nums[j]
,说明遇到了一个新的唯一元素: - 将
nums[i]
赋值给nums[j+1]
,并将慢指针j
增加 1。 - 如果
nums[i]
等于nums[j]
,则跳过该元素,继续下一个元素的检查。
- 对于每个元素
-
返回结果:
- 最终
j + 1
的值即为移除后的数组的新长度。
- 最终
3. 代码
#include <vector>
class Solution
{
public:
int removeDuplicates(std::vector<int>& nums)
{
if (nums.empty()) return 0; // 如果数组为空,直接返回0
int j = 0; // 慢指针,指向新数组的末尾位置
for (int i = 0; i < nums.size(); ++i) // 快指针,遍历原数组
{
if (nums[i] != nums[j]) // 如果当前元素不等于慢指针所指的元素
{
nums[++j] = nums[i]; // 将当前元素放到慢指针的下一个位置,并移动慢指针
}
}
return j + 1; // 返回新数组的有效长度
}
};
4. 错误总结
- 一次过