C/C++刷题DAY2

1.第一题

27. 移除元素 - 力扣(LeetCode)

 分析:对于此题,我们使用双指针的方式去写它,需要注意空间复杂度是O(1),时间复杂度也是尽量的越低越好,要去需要原地修改数组,因此不能够创建其他的临时数组。

代码如下:

int removeElement(int* nums, int numsSize, int val)
{
    int str = 0;
    int des = 0;
    while(str < numsSize)
    {
        if(nums[str] == val)
        {
            str++;
        }
        else
        {
            nums[des]=nums[str];
            des++;
            str++;
        }
    }
    return des;
}

2.第二题

26. 删除有序数组中的重复项 - 力扣(LeetCode)

文字分析:

1.此题本质上是一个去重算法

2. 需要在原数组上改动,那么一定要用到数组上元素的覆盖

3.元素要覆盖的话,必须要使用两个以及指针去指向这两个元素才能完成元素的覆盖

4.覆盖完成之后,输出最前的数据,就是已经排好顺序的去重之后的数据了

5.我们这里采用的指针是ptr和str

6.当ptr指向的数据和str指向的数据相同的时候,str往后挪动一位,如果此时还相同,就继续往后挪动,直到ptr和str指向的数据不相同,此时将ptr向后移动一位(保留一开始指向位置的数据,而后面的数据将被覆盖),再把str指向的值赋值给ptr指向的值

图解分析:

参考代码:

int removeDuplicates(int* nums, int numsSize)
{
    int str = 0;
    int ptr = 0;
    while(str < numsSize)
    {
        if(nums[str] == nums[ptr])
        {
            str++;
        }
        else
        {
            ptr++;
            nums[ptr] = nums[str];
        }
    }
    return ptr+1;

}

3.第三题

88. 合并两个有序数组 - 力扣(LeetCode)

 思路分析:

1.非递减顺序可以理解为升序的序列

2.本题的要求是要合并两个数组nums1和nums2,合并之后的数组要存在第一个数组nums1里面,且刚刚好存满这个数组nums1

3.并且存完之后的nums2是升序排列的

4.那要怎么保证升序呢?

5.将nums2中的元素和nums1的中的元素比较就行,从后往前遍历2个数组,较大的放最后,较小的放前面

6.若要比较,那么至少需要三个指针来比较,指针p1和指针p2,指向的是要比较的元素,指针j指向的是比较完之后的那么较大的值或者较小的值应该怎么存。

图片分析:

第一种情况:

 第二种情况:

参考代码:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
    int p1 =m-1;
    int p2 =n-1;
    int j=m+n-1;
    while(p1>=0 && p2>=0)
    {
        if(nums1[p1]>nums2[p2])
        {
            nums1[j--]=nums1[p1--];
        }
        else
        {
             nums1[j--]=nums2[p2--];
        }
    }
    while(p2>=0)
    {
          nums1[j--]=nums2[p2--];
    }
}
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

待己以诚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值