Bootstrap

蓝桥杯算法题目练习

2022练习题

1161: 三值排序

题目描述

给一个长度为n的数组,其中数组各元素的值仅为1、2、3。
求排成升序的最少交换次数。

输入格式

第一行为正整数n,不超过1000。
接下来n行,每行一个整数表示数组元素。

输出格式

输出一个数字表示答案。

**思路:**记录排序后是1/2/3的区域,遍历原列表,如果不在自己对应的区域,则先去自己应该在的区域里面找,找到了则交换,找不到再从全局查找。

代码:

if __name__ == "__main__":
    n = int(input())
    l = []
    dic = {
   }
    result = 0
    for i in range(n):
        j = int(input())
        l.append(j)
        if dic.get(j):
            dic[j] += 1
        else:
            dic[j] = 1
    count = 1
    offset = 0
    for i in range(n):
        while not dic.get(count) and count <= 3:
            count += 1
        if i == dic[count] + offset:
            offset += dic[count
;