《力扣每日一题》—— 合并两个有序数组

简介: 《力扣每日一题》—— 合并两个有序数组

1ccda504d09b47439d0ac2c52e2939e5.png

📝思路一:常规双指针

不是说nums1的数组长度是m+n吗?

所以一开始我是想直接把nums2的元素按大小添加到nums1中😂

但在添加过程我发现如果直接将nums1和nums2中元素的值进行比较,按大小顺序添加到nums1里,这样是会把原来nums1中的元素  给覆盖掉的,所以我就直接把nums1中合并前的元素复制到了tmp数组中


然后设置两个双指针,分别指向各种数组的起始位置,通过这两个双指针不断的对tmp数组和nums2数组进行大小比较,再依次放到nums1数组中

🌰代码如下:

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int[] tmp = new int[m]; 
        for (int i = 0; i < m; ++i) tmp[i] = nums1[i]; // 将nums1合并前的元素复制到tmp数组中
        int p = 0, q = 0, k = 0;
        while ( p < m && q < n) {
            if (tmp[p] <= nums2[q]) { // 如果tmp[p]小,先把tmp[p]放到nums1中
                nums1[k] = tmp[p];
                ++k; ++p; 
            }
            else {
                nums1[k] = nums2[q];
                ++k; ++q;
            }
        }
        while (p < m) {  // 当nums2中的数组合并完了,直接把tmp数组中剩下的元素依次放到nums1就行
            nums1[k] = tmp[p];
            ++k; ++p;
        }
        while (q < n) {
            nums1[k] = nums2[q];
            ++k; ++q;
        }
    }
}


📝思路二:逆序双指针

我们上面那种思路为了防止nums1中的元素被覆盖,用到了额外的数组


🍑但分析题目后我们发现:nums1后边都是0,如果我们把比较后的元素放到nums1的后边,也就是把元素从后往前的放到nums1中(这样不就避免了元素覆盖吗😁)


💡同时我们也应该注意到,既然是把元素从后往前的放到nums1中,那么我们一开始找到肯定这两个数组中最大的元素

💡所以说我们的两个指针,一开始就应该就应该从各种数组中有效元素的结尾出发,然后让他们两两的进行比较求得较大的那个。

💡之后大的继续前移,小的不动,之后再和大的那个元素的前一个进行比较


代码:

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        // 两个指针分别从各自数组的最末尾的一个有效元素出发
        int i = m - 1, j = n - 1, k = n + m - 1; // 从后往前遍历这样nums1的元素不会被覆盖
        while (i >= 0 && j >= 0) {
            if (nums1[i] > nums2[j]) {
                nums1[k] = nums1[i];
                --i; --k;
            }
            else {
                nums1[k] = nums2[j];
                --j; --k;
            }
        }
        // 如果此时i 还大于0,不用管,因为本来就是把数组合并到nums1中,只用考虑j就行
        while (j >= 0) {
            nums1[k] = nums2[j];
            --j; --k;
        }
    }
}


相关文章
|
2月前
leetCode(删除有序数组中的重复项)
如何在不使用额外空间的情况下,通过双指针法原地删除有序数组中的重复项。
38 2
|
4月前
|
存储 Java API
LeetCode------合并两个有序数组(4)【数组】
这篇文章介绍了LeetCode上的"合并两个有序数组"问题,并提供了三种解法:第一种是使用Java的Arrays.sort()方法直接对合并后的数组进行排序;第二种是使用辅助数组和双指针技术进行合并;第三种则是从后向前的双指针方法,避免了使用额外的辅助数组。
LeetCode------合并两个有序数组(4)【数组】
|
2月前
【LeetCode 48】108.将有序数组转换为二叉搜索树
【LeetCode 48】108.将有序数组转换为二叉搜索树
41 0
|
4月前
|
算法
LeetCode第26题删除有序数组中的重复项
这篇文章介绍了LeetCode第26题"删除有序数组中的重复项"的解题方法,通过使用双指针技巧,高效地去除数组中的相邻重复元素。
LeetCode第26题删除有序数组中的重复项
|
4月前
|
算法
LeetCode第80题删除有序数组中的重复项 II
文章介绍了LeetCode第80题"删除有序数组中的重复项 II"的解法,利用双指针技术在O(1)空间复杂度内原地删除重复元素,并总结了双指针技术在处理有序数组问题中的应用。
LeetCode第80题删除有序数组中的重复项 II
|
4月前
|
Python
【Leetcode刷题Python】977. 有序数组的平方
解决LeetCode "有序数组的平方" 问题的方法:使用Python内置的快速排序、直接插入排序(但会超时)和双指针技术,并给出了每种方法的Python实现代码。
23 1
【Leetcode刷题Python】977. 有序数组的平方
|
4月前
|
算法
LeetCode第88题合并两个有序数组
文章分享了LeetCode第88题"合并两个有序数组"的解法,通过从后向前的合并策略避免了数组元素的前移,使用三个指针高效地完成了合并过程。
|
4月前
|
Python
【Leetcode刷题Python】108. 将有序数组转换为二叉搜索树
LeetCode上108号问题"将有序数组转换为二叉搜索树"的Python实现,通过递归选取数组中间值作为根节点,构建高度平衡的二叉搜索树。
28 2
|
4月前
|
算法 Java
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
56 0
|
4月前
|
Python
【Leetcode刷题Python】26. 删除有序数组中的重复项
本文提供了一种使用快慢指针法在原地删除升序数组中重复元素的Python实现,返回删除后数组的新长度,同时保持元素的相对顺序。
48 0