zoukankan      html  css  js  c++  java
  • 88. Merge Sorted Array

    题目:

    Given two sorted integer arrays A and B, merge B into A as one sorted array.

    Note:
    You may assume that A has enough space (size that is greater or equal to m + n) to hold additional elements from B. The number of elements initialized in A and B are mand n respectively.

    链接: http://leetcode.com/problems/merge-sorted-array/

    一刷,这道题写的太恶心了。因为python的for循环使用起来有限制,只能用在sequence上,我经常自己就固定在使用range

    这道题经过的错误

    1. line3-8没有检查,其中第8行后来还忘记return

    2. idx_m, idx_n应该检查是否>=0,而非仅仅>0

    3. line 20,检查>= 0

    4. line 21的上边界要+1

     1 class Solution(object):
     2     def merge(self, nums1, m, nums2, n):
     3         if n == 0:
     4             return
     5         if m == 0:
     6             for i in range(n):
     7                 nums1[i] = nums2[i]
     8             return
     9         idx_m = m - 1
    10         idx_n = n - 1
    11         for idx in range(m + n):
    12             if idx_m >= 0 and idx_n >= 0:
    13                 nums1[-idx - 1] = nums1[idx_m] if nums1[idx_m] > nums2[idx_n] else nums2[idx_n]
    14                 if nums1[idx_m] > nums2[idx_n]:
    15                     idx_m -= 1
    16                 else:
    17                     idx_n -= 1
    18             else:
    19                 break
    20         if idx_n >= 0:
    21             for idx in range(idx_n + 1):
    22                 nums1[idx] = nums2[idx]

    基本上前面这个解法是不能看的。

    注意到nums1后面的下标是跟m, n同时变化的,可以减少一个变量来计算下标。注意line 4的条件判断和line 5是否过界

     1 class Solution(object):
     2     def merge(self, nums1, m, nums2, n):
     3 
     4         while m and n:
     5             if nums1[m - 1] > nums2[n - 1]:
     6                 nums1[m + n - 1] = nums1[m - 1]
     7                 m -= 1
     8             else:
     9                 nums1[m + n - 1] = nums2[n - 1]
    10                 n -= 1
    11         for i in range(n):
    12             nums1[i] = nums2[i]

    2/15/2017, Java

     1 public class Solution {
     2     public void merge(int[] nums1, int m, int[] nums2, int n) {
     3         int i = m - 1;
     4         int j = n - 1;
     5         int k = m + n - 1;
     6 
     7         for (; i >= 0 && j >= 0 && k >= 0; k--) {
     8             if (nums1[i] <= nums2[j]) {
     9                 nums1[k] = nums2[j];
    10                 j--;
    11             } else {
    12                 nums1[k] = nums1[i];
    13                 i--;
    14             }
    15         }
    16         while (j >= 0) {
    17             nums1[k] = nums2[j];
    18             k--;
    19             j--;
    20         }
    21     }
    22 }
  • 相关阅读:
    编译原理笔记 2
    编译原理笔记 1
    初步学习计算机图形学 [闫令琪]
    复杂 Web 前端的设计
    使用 GitHub Actions 部署 .Net 5 程序
    ES 2020 Optional Chain (可选链)
    2020 Web 前端学习记录
    WPF TreeView 支持多选
    linux (CentOS 7)报错:yum 命令报错 “ Cannot find a valid baseurl for repo: base/7/x86_6 ”
    node.js 报错
  • 原文地址:https://www.cnblogs.com/panini/p/5586623.html
Copyright © 2011-2022 走看看