本篇博客给大家带来的是用C++语言写的合并两个有序数组、移除元素、删除有序数组的重复项算法。
🐟🐟文章专栏:C++
🚀🚀若有问题评论区下讨论,我会及时回答
❤❤欢迎大家点赞、收藏、分享
你们的支持就是我创作的动力
今日思想:既然认准一条道路何必去打听要走多久!!
一、合并两个有序数组
方法:谁大放谁回后面
题目描述:
图片解疑:
两种情况:
情况一:
上面图是第一种情况:num1的数据都大于num2的数据,当然我们假设这两个数组的数据如上。如果num1[l1]<num2[l2]就让num1[l3]=num2[l2];放完之后l2和l3都要减一。统称为谁大放谁到num1的后面。这时你会发现会把num2的数据全都放到num1的后面,l2已经小于0了,这时num1就是一个有序的数组,无需更改。l1没变
情况二:
num1数组的数据大于num2数组的数据,按照谁大放谁回num1后面的原则,我们会发现num1的数据全都放回到最后面,l1已经小于0了,num2数组的数据没用到,所以我们用个循环就把num2的数据放到num1的前面。
代码实例:
cpp
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
int l1=m-1;
int l2=n-1;
int l3=n+m-1;
while(l1>=0 && l2>=0)
{
if(nums1[l1]<nums2[l2])
{
nums1[l3--]=nums2[l2--];
}
else
{
nums1[l3--]=nums1[l1--];
}
}
if(l1<0)
{
while(l2>=0)
{
nums1[l3--]=nums2[l2--];
}
}
}
二、移除元素
方法:双指针
题目描述:
图片解疑:
我们定义两个变量分别为sor、dest。如果nums[ dest ] !=val;那么nums[ sor ]=nums[ dest ],dest和sor都要加一。 如果等于的话只让dest加一。这时候sor等于2,返回sor就行。
最后结果:
代码实例:
cpp
int removeElement(int* nums, int numsSize, int val) {
int sor=0;
for(int dest=0;dest<numsSize;dest++)
{
if(nums[dest] != val)
{
nums[sor++]=nums[dest];
}
}
return sor;
}
三、 删除有序数组的重复项
方法:双指针
题目描述:
图片解疑:
我们让sor=0;dest=1;如果nums[dest]=nums[sor],dest++;不等话sor++,nums[sor]=nums[dest]
然后再dest++;着时候前sor+1的数据是不同的,所以返回sor+1就行。
最后的结果:
代码实例 :
cpp
int removeDuplicates(int* nums, int numsSize) {
int sor=0;
int dest=1;
while(dest<numsSize)
{
if(nums[dest]==nums[sor])
{
dest++;
}
else
{
sor++;
nums[sor]=nums[dest];
dest++;
}
}
return sor+1;
}
可化简为:
cpp
int removeDuplicates(int* nums, int numsSize) {
int sor=0;
int dest=1;
while(dest<numsSize)
{
if(nums[dest]!=nums[sor])
{
sor++;
nums[sor]=nums[dest];
}
dest++;
}
return sor+1;
}
特殊情况:
在这种情况中会重复赋值,所以如果nums[dest]!=nums[sor],然后sor++之后在判断sor是否不等于dest,如果不等让nums[ sor ]=nums[ src ];这样就可以避免重复赋值。
代码如下:
cpp
int removeDuplicates(int* nums, int numsSize) {
int sor=0;
int dest=1;
while(dest<numsSize)
{
if(nums[dest]!=nums[sor])
{
if(++dest != src)
{
nums[sor]=nums[dest];
}
}
dest++;
}
return sor+1;
}
可优化代码为:
cpp
int removeDuplicates(int* nums, int numsSize) {
int sor=0;
int dest=1;
while(dest<numsSize)
{
if(nums[dest]!=nums[sor] && ++dest != src)
{
nums[sor]=nums[dest];
}
dest++;
}
return sor+1;
}
完!!