编辑
2023-07-17
🤓算法
00
请注意,本文编写于 702 天前,最后修改于 225 天前,其中某些信息可能已经过时。

目录

题目介绍
个人第一次解法
逆向双指针
总结

题目介绍

个人第一次解法

python
# coding:utf-8 # 关键点:有序数组、去0、 # 核心思路:m or n =0的就不考虑了 nums1.length = m+n nums2.length = n def merge(nums1, m, nums2, n): # 思路:将nums1和nums2中的0去掉,然后合并,进行排序 if len(nums1) != m: for i in range(len(nums1) - m): nums1.remove(0) if len(nums2) != n: for i in range(len(nums2) - n): nums2.remove(0) nums1 += nums2 nums1.sort() nums1 = [1, 2, 3, 0, 0, 0] m = 3 nums2 = [2, 5, 6] n = 3 merge(nums1, m, nums2, n)

逆向双指针

参照链接 方法:按照链接的来写代码,不看他写好的,然后总结自己出现的问题

python
# coding:utf-8 # 逆向双指针的解法 # 题目给出return nothing,代表着要原地修改,将空间复杂度降低为o(1) # 原地修改时,为避免从前往后遍历导致原有数组元素被破坏掉,我们要选择从后往前遍历, # 自己按照图谱出现问题的地方: # 1. 边界条件考虑清楚:i和j都小于0 # 2. 临界情况,当j=-1的时候,或者i=-1,要特殊处理一下,避免出现index out of的报错 # 3. 其他按照互相比大小,然后赋值给nums1的元素 def merge(nums1, m, nums2, n): # 设 i为nums1的指针,指向最后一个元素,j为nums2的指针,指向最后一个元素,k指向nums1最后一个元素(0) i, j = m - 1, n - 1 k = len(nums1) - 1 while j >= 0 or i >= 0: if j==-1: nums1[k] = nums1[i] i -= 1 elif i == -1: nums1[k] = nums2[j] j-=1 elif nums1[i] >= nums2[j]: nums1[k] = nums1[i] i -= 1 elif nums1[i] < nums2[j]: nums1[k] = nums2[j] j -= 1 k -= 1 print(nums1) nums1 = [1,2,3,0,0, 0] m = 3 nums2 = [4,5,6] n = 3 merge(nums1, m, nums2, n)

总结

  1. 循环的边界情况要考虑清楚
  2. 边界的特殊情况要处理,保证程序不会出现报错,例如:index out of 的报错
  3. 画图,嘴巴一边说,一边去程序移动的过程,多说几遍,多巩固自己的思路
  4. 测试,debug,找出自己未能考虑到的地方
  5. 原地修改的情况,在今后的算法题中可以考虑使用指针,逆向双向指针

本文作者:Eric

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!