【问题标题】:Find the position to insert an element into a sorted array找到将元素插入排序数组的位置
【发布时间】:2017-04-18 22:40:26
【问题描述】:

问题:找到将元素插入排序数组的位置

A[1] > A[2] > A[3] > ... > A[ n ]
  1. 显示最好和最坏的情况。
  2. 编写算法解决问题

我的回答:

最好的情况是 T(n) = 1,换句话说,在第一个位置,其中 n 是元素的大小。最坏的情况是 T(n) = n + 1,也就是最后一个位置 + 1。

  def find_position(element, l):
        i = 0
        inserted = False
        for item in l:
            if element < item:
                inserted =  True
                break
            i = i +1
        if not inserted:
            return len(l)
        else:
            return i

其他一些学生写了一个二分搜索,最坏的情况比我的好,并告诉我我的答案不正确。但我不同意,因为这个练习没有明确写出优化算法。

我的逻辑有什么错误吗?

【问题讨论】:

  • 你实际上并没有插入任何东西。此外,最好和最坏的情况在不参考特定算法的情况下是没有意义的,因此第 1 部分不是一个格式正确的问题。
  • 对不起,我修正了老师的答案,翻译错误。葡萄牙语是:“Considere o problema de encontrar a posição de inserção de um novo elemento em conjunto ordenado:”

标签: python algorithm


【解决方案1】:

鉴于你所说的条件很简单:

1) 编写算法来解决问题 2)分析所述问题的渐近复杂度

你显然做到了。您的解决方案只是显而易见的解决方案,而不是最好的解决方案。

【讨论】:

    【解决方案2】:

    只需检查它是否在数字之后(如下所示..)

    for l in range(0, len(lst)):
        if lst[l] >= number_to_be_inserted:
            lst.insert(l+1, number_to_be_inserted)
            break
    

    【讨论】:

      【解决方案3】:

      二分搜索的最佳情况效率为 O(1),最坏情况(平均情况)效率为 O(log n)。

      public static int searchInsert(int[] nums, int target) {
          int start = 0;
          int end = nums.length - 1;
      
          if (nums[end] < target) {
              return end + 1;
          } else if (nums[start] >= target) {
              return start;
          }
      
          while (start < end) {
              int mid = start + (end - start) / 2;
              if (nums[mid] == target) {
                  return mid;
              } else if(nums[mid] < target) {
                  start = mid + 1;
              } else {
                  end = mid;
              }
          }
          return end;
      }
      

      【讨论】:

        猜你喜欢
        • 2011-09-11
        • 2014-12-27
        • 1970-01-01
        • 2016-11-03
        • 2011-03-22
        相关资源
        最近更新 更多