Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何找到排序列表的最小移动次数?_Python_Python 3.x_Sorting - Fatal编程技术网

Python 如何找到排序列表的最小移动次数?

Python 如何找到排序列表的最小移动次数?,python,python-3.x,sorting,Python,Python 3.x,Sorting,在一个由N个不同整数组成的给定列表中,我希望通过按升序将一个元素移动到列表的末尾,找到排序列表所需的最小移动次数 输出为:1 4 3 2 5[1,3,2,5,4]1[1,2,5,4,3]2[1,2,4,3, 5] 3[1,2,3,5,4]4[1,2,3,4,5]5无 让我们首先观察以下事实 要获得最小步数,一个数字只能移动一次 较小的数字必须先移动到左边 如果数字右边的数字较小,则该数字不合适 考虑到这一点,我们可以从右向左遍历列表,并跟踪非递减的数字(3)。通过对这些数字(2)进行排序,我们得

在一个由N个不同整数组成的给定列表中,我希望通过按升序将一个元素移动到列表的末尾,找到排序列表所需的最小移动次数


输出为:1 4 3 2 5[1,3,2,5,4]1[1,2,5,4,3]2[1,2,4,3, 5] 3[1,2,3,5,4]4[1,2,3,4,5]5无


让我们首先观察以下事实

  • 要获得最小步数,一个数字只能移动一次
  • 较小的数字必须先移动到左边
  • 如果数字右边的数字较小,则该数字不合适
  • 考虑到这一点,我们可以从右向左遍历列表,并跟踪非递减的数字(3)。通过对这些数字(2)进行排序,我们得到了最佳步骤。这是最佳的,因为必须移动的数字只移动一次(1)

    根据您对该算法的使用情况,剩下的就是将该输出转换为可用格式,以表示您的步骤序列

    或者,如果这是最重要的,您可以简单地保持步骤计数

    def end_sort_steps(lst):
        steps = 0
        right_min = max(lst)
    
        for n in reversed(lst):
            if n >= right_min:
                # Then the number must be moved
                steps += 1
            else:
                # Otherwise it is the smallest number seen yet
                right_min = n
    
        return steps
    

    输出是:1 4 3 2 5[1,3,2,5,4]1[1,2,5,4,3]2[1,2,4,3,5]3[1,2,3,5,4]4[1,2,3,4,4,5]5非应该是
    [1 4 3 2 5]->[1,4,2,5,3]->[1,2,5,3,4]->[1,2,3,3,3,5]
    def end_sort_steps(lst):
        steps = []
        right_min = max(lst)
    
        for n in reversed(lst):
            if n >= right_min:
                # Then the number must be moved
                steps.append(n)
            else:
                # Otherwise it is the smallest number seen yet
                right_min = n
    
        return sorted(steps)
    
    print(end_sort_steps([1, 4, 3, 2, 5])) # [3, 4, 5]
    # This corresponds to the steps:
    # [1, 4, 3, 2, 5] -> [1, 4, 2, 5, 3] -> [1, 2, 5, 3, 4] -> [1, 2, 3, 4, 5]
    
    def end_sort_steps(lst):
        steps = 0
        right_min = max(lst)
    
        for n in reversed(lst):
            if n >= right_min:
                # Then the number must be moved
                steps += 1
            else:
                # Otherwise it is the smallest number seen yet
                right_min = n
    
        return steps