【LeetCode】删除有序数组中的重复项、合并两个有序数组

简介: 【LeetCode】删除有序数组中的重复项、合并两个有序数组

作者:一个喜欢猫咪的的程序员

专栏:《Leetcode》

喜欢的话:世间因为少年的挺身而出,而更加瑰丽。                                  ——《人民日报》

目录

26.删除有序数组中的重复项:

88.合并两个有序数组:


26.删除有序数组中的重复项:


26. 删除有序数组中的重复项

https://leetcode.cn/problems/remove-duplicates-from-sorted-array/

题目:

示例:


示例 1:


输入:nums = [1,1,2]

输出:2, nums = [1,2,_]

解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。

示例 2:


输入:nums = [0,0,1,1,1,2,2,3,3,4]

输出:5, nums = [0,1,2,3,4]

解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。


思路:


思路一:(双指针暴力解法)


利用双指针begin和end一前一后,每次begin和end相等时,设一个变量i=begin,利用i来将右边的值赋给左边,以此循环左边都是一次出现的值了。


初始条件:begin=0     end=1

结束条件:begin>=size||endsize||end==size-1的情况

迭代原理:

当nums[begin]=nums[begin+1]的时候,nums[i]=nums[i+1]向左覆盖,size--,另外的情况,nize--就可以了



时间复杂度:O(N^2)                                 空间复杂度:O(1)


思路二:双指针优化


还是利用两个指针,因为我们返回值个数,只检查前numsSize个值是否符合条件,但后面的值不管,所以我们可以这样。


当begin所值的值与end所指的值想同时,我们end后移一位,然后如果这两个值所指的值相等,继续此操作,如果不相等,先进行begin后移一位,然后将把end所指的值赋给begin所指的位置,然后end后移(如果不先begin++再赋值的话,会顺序不对)。

思路一:

int removeDuplicates(int* nums, int numsSize) {
    int begin = 0;
    int end = 1;
    while (begin < numsSize && end < numsSize)
    {
        while (nums[begin] == nums[begin+1])
        {
            if(end==numsSize-1)
            {
                numsSize--;
                break;
            }
            else
            {
            for (int i = end; i < numsSize-1; i++)
            {
                nums[i] = nums[i + 1];
            }
            numsSize--;
            }
        }
        begin = end;
        end++;
    }
    return numsSize;
}

思路二:

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


88.合并两个有序数组


88. 合并两个有序数组

https://leetcode.cn/problems/merge-sorted-array/

题目:

示例:


示例 1:


输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3

输出:[1,2,2,3,5,6]

解释:需要合并 [1,2,3] 和 [2,5,6] 。

合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。

示例 2:


输入:nums1 = [1], m = 1, nums2 = [], n = 0

输出:[1]

解释:需要合并 [1] 和 [] 。

合并结果是 [1] 。

示例 3:


输入:nums1 = [0], m = 0, nums2 = [1], n = 1

输出:[1]

解释:需要合并的数组是 [] 和 [1] 。

合并结果是 [1] 。

注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。


思路:


思路一: 利用额外数组法


将两个数组元素进行比较,较小的赋值给额外数组sort。


时间复杂度:O(m+n)                  空间复杂度:O(m+n)


思路二: 逆向双指针


我们在思路一的基础上优化,我们双指针一般是一前一后或者两个在头作比较,本题我们双指针两个都在后面,作比较哪个比较大再放在nums1的尾部,然后分别自减。这样就可以避免从前面作比较后造成的原nums1前面的元素丢失了。


时间复杂度:O(m+n)                  空间复杂度:O(1)


思路一:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    int q1 = 0;
    int q2 = 0;
    int sort[m + n];
    if (n == 0)
        ;
    else {
        for (int i = 0; i < m + n; i++)
        {
            if (q2 == n)
                sort[i] = nums1[q1++];
            else if (q1 == m)
                sort[i] = nums2[q2++];
            else  if (nums1[q1] > nums2[q2])
                sort[i] = nums2[q2++];
            else
                sort[i] = nums1[q1++];
        }
        for (int i = 0; i < m + n; i++)
        {
            nums1[i] = sort[i];
        }
    }
}

思路二:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
    int end1=m-1;
    int end2=n-1;
    int i=n+m-1;
    while(end1>=0||end2>=0)
    {
        if(end2<0)
         nums1[i--]=nums1[end1--];
        else if(end1<0)
        nums1[i--]=nums2[end2--];
        else  if(nums1[end1]>nums2[end2])
        nums1[i--]=nums1[end1--];
        else
        nums1[i--]=nums2[end2--];
    }
}
相关文章
|
16天前
|
存储 传感器 算法
LeetCode题目89:格雷码 递归、迭代及位操作在数组合并中的应用
LeetCode题目89:格雷码 递归、迭代及位操作在数组合并中的应用
|
7天前
leetcode题解:1768.交替合并字符串
leetcode题解:1768.交替合并字符串
18 0
|
7天前
|
存储 算法
leetcode题解:88.合并有序数组
leetcode题解:88.合并有序数组
11 0
|
7天前
|
索引
leetcode题解:26.删除有序数组重复项
leetcode题解:26.删除有序数组重复项
6 0
|
16天前
|
存储 算法 数据挖掘
LeetCode 题目 88:双指针\直接\递归\插入排序\归并排序 实现合并两个有序数组
LeetCode 题目 88:双指针\直接\递归\插入排序\归并排序 实现合并两个有序数组
|
16天前
|
数据采集 算法 数据挖掘
LeetCode 题目 80:删除排序数组中的重复项 II【算法面试高频题】
LeetCode 题目 80:删除排序数组中的重复项 II【算法面试高频题】
|
17天前
|
SQL 算法 数据可视化
LeetCode第26题:删除排序数组中的重复项
LeetCode第26题:删除排序数组中的重复项
|
17天前
|
存储 算法 数据挖掘
Leetcode二十三题:合并K个升序链表【22/1000 python】
Leetcode二十三题:合并K个升序链表【22/1000 python】
|
17天前
|
SQL 算法 数据挖掘
LeetCode 二十一:合并两个有序链表 【python】
LeetCode 二十一:合并两个有序链表 【python】
|
12天前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题