LeetCode:MergeArray(合并有序数组)

电玩女神 2022-04-15 05:05 279阅读 0赞

文章最前: 我是Octopus,这个名字来源于我的中文名—章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的动态,一起学习,共同进步。

相关文章:

  1. LeetCode:55. Jump Game(跳远比赛)
  2. Leetcode:300. Longest Increasing Subsequence(最大增长序列)
  3. LeetCode:560. Subarray Sum Equals K(找出数组中连续子串和等于k)

文章目录:

题目描述:

java实现方法1:

python实现方式1:

源码地址:


题目描述:

比如两个数组:int [] arr1={1,2,3,4}; int [] arr2={4,5,6,7,8};


java实现方法1:

也是比较常用的一种,两个指针;

步骤:

  1. 1.两个指针分别指向数组的起始位置;
  2. 2.比较他们两个指向的值,如果小的放进另外一个数组,进行比较;
  3. 3.再判断两个数组是否都遍历完;
  4. /**
  5. * 按照要求合并两个数组
  6. *
  7. * @param arr1 数组1
  8. * @param arr2 数组2
  9. */
  10. private int[] merge(int[] arr1, int[] arr2) {
  11. if (arr1 == null || arr1.length == 0) {
  12. return arr2;
  13. }
  14. if (arr2 == null || arr2.length == 0) {
  15. return arr1;
  16. }
  17. int i = 0;
  18. int j = 0;
  19. int[] newArr = new int[arr1.length + arr2.length];
  20. int count = 0;
  21. while (i < arr1.length && j < arr2.length) {
  22. if (arr1[i] < arr2[j]) {
  23. newArr[count] = arr1[i];
  24. i++;
  25. count++;
  26. }else if (arr1[i] == arr2[j]) {
  27. newArr[count] = arr1[i];
  28. i++;
  29. j++;
  30. count++;
  31. }else{
  32. newArr[count] = arr2[j];
  33. j++;
  34. count++;
  35. }
  36. // 当arr1的指针已经到了末尾,直接把arr2后面的数组添加到数组中
  37. if (i == arr1.length) {
  38. for (int index = j; index < arr2.length; index++) {
  39. newArr[count] = arr2[index];
  40. count++;
  41. }
  42. }
  43. // 当arr2的指针已经为到末尾,直接将arr1中的数组添加到数组当中
  44. if (j == arr2.length) {
  45. for (int index = i; index < arr1.length; index++) {
  46. newArr[count] = arr1[index];
  47. count++;
  48. }
  49. }
  50. }
  51. return Arrays.copyOfRange(newArr, 0, count);
  52. }

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

空间复杂度:O(n)


python实现方式1:

  1. def merge(self, nums1: List[int], nums2: List[int]) -> List[int]:
  2. '''
  3. 合并两个数组
  4. Args:
  5. nums1:数组1
  6. nums2:数组2
  7. Returns:
  8. 合并后数组
  9. '''
  10. if not nums1:
  11. return nums2
  12. if not nums2:
  13. return nums1
  14. i, j, result = 0, 0, []
  15. while i < len(nums1) and j < len(nums2):
  16. if nums1[i] < nums2[j]:
  17. result.append(nums1[i])
  18. i += 1
  19. elif nums1[i] == nums2[j]:
  20. result.append(nums1[i])
  21. i += 1
  22. j += 1
  23. else:
  24. result.append(nums2[j])
  25. j += 1
  26. if i == len(nums1):
  27. result.extend(nums2[j:len(nums2)])
  28. if j == len(nums2):
  29. result.extend(nums1[i:len(nums1)])
  30. return result

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

空间复杂度:O(n)


源码地址:

https://github.com/zhangyu345293721/leetcode

发表评论

表情:
评论列表 (有 0 条评论,279人围观)

还没有评论,来说两句吧...

相关阅读

    相关 有序数组合并

    有两个从小到大排序以后的数组A和B,其中A的末端有足够的缓冲空容纳B。请编写一个方法,将B合并入A并排序。 给定两个有序int数组A和B,A中的缓冲空用0填充,同时给定A和B

    相关 合并有序数组问题

    感谢:感谢大家提出问题,首先对有问题的算法抱歉,文章中已经修改了代码的实现,欢迎大家再次提出问题。 有这样一个问题,现在有两个有序的数组,第一个数组的空间足够容纳两个有序