重新排序红色,蓝色和绿色球的数组

时间:2012-08-11 06:26:49

标签: algorithm sorting

在我的一次采访中,面试官问我 - 一些大小的数组包含随机混合的红色,蓝色和绿色球。 比如RGBBBRRGGG,其中RGB是红色,绿色和蓝色。

最终获得像RRRRGGGGBBBB这样的数组的最佳方式是什么? 即所有R,所有G和所有B在一起。

我建议将所有红色,蓝色,绿色转换为ASCII值,然后在其上运行最有效的排序算法。 但他没有留下深刻的印象。还有其他更有效的解决方案吗?空间和时间复杂度最低?

7 个答案:

答案 0 :(得分:13)

只需遍历数组并分别计算RGB的出现次数。然后,输出字符串。线性时间。

答案 1 :(得分:8)

面试官可能想知道你是否熟悉Dutch national flag problem。它有一个简单的线性解决方案。维基百科页面上有C++Java个例子。

答案 2 :(得分:0)

修改我可能误解了您的问题

您想要将RGB值转换为HSL值。然后你就会知道它会告诉你它最接近的颜色的色调,它可以分类出它所属的R / G / B部分。然后你可以走得更远,进入色调,饱和度和光照来确定它们的确切顺序彼此之间,相对于整个阵列。

答案 3 :(得分:0)

此外,如果您可以像“4R4G4B”一样保存以有效保存

答案 4 :(得分:0)

这个问题很容易在线性时间内完成。为了进一步改进算法,你可以创建一个计数器数组int [3]并使计数器[0],计数器[1]和计数器[2]分别计数红色,绿色和蓝色。因此,您只需要完成一次数组。

最小化空间复杂度的另一个解决方案是有3个指针:current,rg和gb。指针电流表示您当前正在查看的阵列位置,rg和gb分别是红色/绿色和绿色/蓝色之间的边界。初始化current = 0,rg = -1,gb = n,其中n = A的大小。

虽然gb>当前   - 如果A [i] == R,则将rg向右移1,并用rg替换当前值   - 否则如果A [i] ==蓝色,将fb向左移1,用gb替换当前   - 否则,什么都不做

空间复杂度= O(n)因为您没有使用任何其他数组 时间复杂度= O(n),每个元素最多交换一次

答案 5 :(得分:0)

Python解决方案

input = [1, 0, 2, 2, 1, 0, 1, 2, 0, 0, 2, 1, 2, 0, 0]

output = []
for i in input:
    if i == 0:
        output.insert(0, i)
    elif i == 2:
        output.append(i)
    else:
        if output.count(2) > 0:
            index = output.insert(output.index(2), i)
        else:
            output.append(i)

print(output)

答案 6 :(得分:0)

此解决方案需要O(n):

def sort_Colors(arr):
    first = 0
    mid = 0
    last = len(arr)-1
    while mid <= last:
        if arr[mid] == 0:
            arr[first] , arr[mid] = arr[mid], arr[first]
            first += 1
            mid += 1
        elif arr[mid] == 1:
            mid += 1
        else:
            arr[mid], arr[last] = arr[last], arr[mid]
            last -= 1
    return arr

输入= [1、2、0、1、0、1、2、0、0、0、0]

输出= [0、0、0、0、0、0、1、1、1、2、2]