在我的一次采访中,面试官问我 - 一些大小的数组包含随机混合的红色,蓝色和绿色球。 比如RGBBBRRGGG,其中RGB是红色,绿色和蓝色。
最终获得像RRRRGGGGBBBB这样的数组的最佳方式是什么? 即所有R,所有G和所有B在一起。
我建议将所有红色,蓝色,绿色转换为ASCII值,然后在其上运行最有效的排序算法。 但他没有留下深刻的印象。还有其他更有效的解决方案吗?空间和时间复杂度最低?
答案 0 :(得分:13)
只需遍历数组并分别计算R
,G
和B
的出现次数。然后,输出字符串。线性时间。
答案 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)
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]