个人主页https://github.com/zbhgis前言本系列主要记录自己学习算法的过程中的感悟。力扣88. 合并两个有序数组链接https://leetcode.cn/problems/merge-sorted-array/description/注意点倒序双指针做法。这道题的题目关键在于答案怎么放入。1.设计三个指针分别直接指向nums1, nums2, nums的末尾。2.当num2的指针没有指向0的时候即nums2中的元素还没合并完的时候分为两种情况一种是nums1[len1]的值大于等于nums2[len2]这个时候就需要将nums1[len]赋值为nums1[len1]把nums1的元素插入到对应的位置同时len和len1同时往前移动一格反之同理。3.这道题如果从前面插入元素的话那么如果遇到先将nums2的元素插入到nums1中就会出现覆盖的情况因此不建议这么做。那为啥可以从后面插入元素呢因为这道题目输入的nums1已经为mn长度的。代码class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { int len1 m - 1; int len2 n - 1; int len m n - 1; while (len2 0) { if (len1 0 nums1[len1] nums2[len2]) { nums1[len --] nums1[len1 --]; } else { nums1[len --] nums2[len2 --]; } } } }时空复杂度分析单层循环会碰到len2和len1长度的数组都遍历的情况。所以时间复杂度为O(mn)空间复杂度为O(1)洛谷T227292 【排序】合并两个有序数组链接https://www.luogu.com.cn/problem/T227292#ide注意点同上代码import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); int n sc.nextInt(); int mx 1000001; int[] nums1 new int[mx]; for (int i 0; i n; i ) { nums1[i] sc.nextInt(); } int m sc.nextInt(); int[] nums2 new int[mx]; for (int i 0; i m; i ) { nums2[i] sc.nextInt(); } int len1 n - 1; int len2 m - 1; int len n m - 1; while (len2 0) { if (len1 0 nums1[len1] nums2[len2]) nums1[len --] nums1[len1 --]; else nums1[len --] nums2[len2 --]; } for (int i 0; i n m - 1; i ) { System.out.print(nums1[i] ); } } }时空复杂度分析同上力扣977. 有序数组的平方链接https://leetcode.cn/problems/squares-of-a-sorted-array/注意点相向指针做法。这道题的题目关键在于将计算后的平方结果有序放入。1.设计两个指针一头一尾。2.核心逻辑就是计算完平方之后遍历原始位置把大的数从后往前放入数组中即可。代码class Solution { public int[] sortedSquares(int[] nums) { int n nums.length; int[] ans new int[n]; int i 0; int j n - 1; for (int p n - 1; p 0; p --) { int x nums[i] * nums[i]; int y nums[j] * nums[j]; if (x y) { ans[p] x; i ; } else { ans[p] y; j --; } } return ans; } }时空复杂度分析单层循环需要遍历n次因此时间复杂度为O(n)空间复杂度为O(1)参考https://programmercarl.com/%E6%95%B0%E7%BB%84%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html