面试经典150题 day1
- 题目来源
- 我的题解
- 方法一 先合并,再排序
- 方法二 逆向双指针
题目来源
力扣每日一题;题序:88
我的题解
方法一 先合并,再排序
先将nums2全部放到nums1之后,然后进行排序。
时间复杂度:O(nlogn)。排序需要的时间
空间复杂度:O(1)
public void merge(int[] nums1, int m, int[] nums2, int n) {int index=m;int r2=0;while(r2<n){nums1[index++]=nums2[r2++];}Arrays.sort(nums1);
}
方法二 逆向双指针
最终答案需要存放在nums1中并且升序排列,所以可以从两个数组的末端开始比较,较大的放入到nums1的右侧。
- 当然,若为了好理解可以使用正向双指针,不过需要借助额外的数组暂存结果。
时间复杂度:O(n+m)
空间复杂度:O(1)
public void merge(int[] nums1, int m, int[] nums2, int n) {int index=m+n-1;int r1=m-1,r2=n-1;while(r1>=0&&r2>=0&&index>=0){if(nums1[r1]>nums2[r2]){nums1[index--]=nums1[r1--];}else{nums1[index--]=nums2[r2--];}}while(r2>=0){nums1[index--]=nums2[r2--];}while(r1>=0){nums1[index--]=nums1[r1--];}}
有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~