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