C/C++刷题DAY2

1.第一题

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

C/C++刷题DAY2_第1张图片

C/C++刷题DAY2_第2张图片

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

C/C++刷题DAY2_第3张图片

代码如下:

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)

C/C++刷题DAY2_第4张图片

C/C++刷题DAY2_第5张图片

文字分析:

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

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

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

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

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

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

图解分析:

C/C++刷题DAY2_第6张图片

参考代码:

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)

C/C++刷题DAY2_第7张图片

C/C++刷题DAY2_第8张图片

 思路分析:

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

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

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

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

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

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

图片分析:

第一种情况:

C/C++刷题DAY2_第9张图片

 第二种情况:

C/C++刷题DAY2_第10张图片

参考代码:

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--];
    }
}

你可能感兴趣的:(刷题合集,c语言,算法,c++,开发语言,数据结构)