个人主页:@Weraphael
✍作者简介:目前学习C++和算法
✈️专栏:Leetcode + 面试/笔试
希望大家多多支持,咱一起进步!
如果文章对你有帮助的话
欢迎 评论 点赞 收藏 加关注
LeetCode链接:移除元素
为什么说是偷鸡摸狗法呢,首先这题是要原地移除所有数值等于 val 的元素。而这题我就偷偷开辟新空间来做,没想到过了hh
- 首先malloc一个新空间
- 把不等于val放到新空间里
- 最后再把新空间的值拷贝回原数组
int removeElement(int* nums, int numsSize, int val)
{
//1.malloc新空间
int* tmp = (int*)malloc(sizeof(int) * numsSize);
int src = 0; //遍历原数组
int dest = 0;//
//2.把不等于val移动到新数组
while(src < numsSize)
{
if (nums[src] != val)
{
tmp[dest] = nums[src];
dest++;
src++;
}
else
src++;
}
//3.将新空间元素拷贝到原数组
memcpy(nums,tmp,sizeof(int) * dest);
//4.释放新数组
free(tmp);
tmp = NULL;
//返回元素个数
return dest;
}
可以使用双指针
- 创建2个指针分别为
src
和dest
,并让它们指向数组中的第一个元素- 接着让
src
去遍历数组- 如果
src != val
,就把以src为下标的值赋给dest为下标,然后两指针分别向后走- 如果
src == val
,就让src
指向下一个元素
【动画展示】
以样例1为例
int removeElement(int* nums, int numsSize, int val)
{
int dest = 0,src = 0;
while(src < numsSize)
{
if (nums[src] != val)
{
nums[dest] = nums[src];
dest++;
src++;
}
else
{
src++;
}
}
return dest;
}
LeetCode链接:删除有序数组中的重复项
这题的思路和上题的“原地删除”思路差不多
- 创建指针dest、src,让其分别指向下标为1和下标为0的位置
- 如果dest和src指向的下标元素相同,就让src往后走
- 如果不相等,先让dest往后走一步(其实是为了覆盖重复项)后再赋值,然后让src继续向后走(不明白后面有动图)
【动图展示】
以样例1为例
int removeDuplicates(int* nums, int numsSize)
{
int src = 1;
int dest = 0;
while (src < numsSize)
{
if (nums[dest] != nums[src])
{
dest++;
nums[dest] = nums[src];
src++;
}
else
{
src++;
}
}
return dest + 1;
}
LeetCode链接:合并两个有序数组
这题就是纯纯合并有序数组的模板。思路可以参考这篇博客 —> 【算法基础】归并排序
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
int* tmp = (int*)calloc(n + m,sizeof(int));
int i = 0;
int j = 0;
int k = 0;
while (i < m && j < n)
{
if (nums1[i] > nums2[j])
{
tmp[k++] = nums2[j++];
}
else
{
tmp[k++] = nums1[i++];
}
}
while (i < m)
{
tmp[k++] = nums1[i++];
}
while (j < n)
{
tmp[k++] = nums2[j++];
}
memcpy(nums1,tmp,sizeof(int) * (n + m));
free(tmp);
tmp = NULL;
}