【问题标题】:How to check if an int array is a circularly sorted array?如何检查int数组是否是循环排序数组?
【发布时间】:2015-09-14 01:56:52
【问题描述】:

我有一个整数数组,比如{1, 3, 4, 7, -9, 0}。这个数组是循环排序的,而数组{2, 4, 9 , 3}不是循环排序的。

如果数组的元素除旋转外都已排序,则数组是循环排序的。

例如:

4 5 6 7 1 2 3

这里的元素1 2 3 4 5 6 7 是“按顺序”排列的,但它们向左旋转了三倍。因此,如果我们向右旋转 3,我们会得到 1 2 3 4 5 6 7,这是一个排序数组。

给定一个数组,如何判断该数组是否循环排序?

【问题讨论】:

  • 也许您想与我们分享您迄今为止所尝试的一切?
  • 例如:4 5 6 7 1 2 3 这里的元素(1 2 3 4 5 6 7)是“按顺序”排列的,但是向左旋转了三个。跨度>
  • 我已投票决定重新开放。我最近也遇到了这个问题并找到了解决方案。有一种蛮力的方法,也有一种优雅的方法……你想要哪个? :P
  • 数一下value[i] > value[(i+1)%length]的次数。如果答案为 0 或 1,则循环排序。
  • @Tom,这就是(i+1)%length 的用途。它检查最后一个数字(在您的示例中为 2)是否大于第一个数字(在您的示例中为 1)。因为2>1 那么这个算法会有两个“中断”并且失败。看看我回答中的编辑示例,我添加了你的测试用例。

标签: java arrays sorting


【解决方案1】:

您可以遍历数组并检查所有值是否都在增加。一旦你遇到第一个不增加的值,请检查它和以下所有值是否增加并且小于或等于数组中的第一个元素。

编辑:

我觉得人们对 Daniel 的解决方案不屑一顾,因为他们不理解它或认为它被破坏了。这很可悲,因为我认为他的解决方案非常出色。

def is_circular_sorted(arr):
    count = 0
    length = len(arr)
    for i in range(length):
        if arr[i] > arr[(i+1) % len(arr)]:
            count += 1
    return count <= 1

In [4]: is_circular_sorted([1, 2, 3, 4])
Out[4]: True

In [5]: is_circular_sorted([1, 1, 1, 1])
Out[5]: True

In [6]: is_circular_sorted([1, 3, 4, 7, -9])
Out[6]: True

In [7]: is_circular_sorted([1, 3, 4, 2])
Out[7]: False

稍微解释一下。要检查列表是否是循环排序的,我的原始答案说您需要检查是否有一个或更少的“中断”被完全排序,并且“中断”之后的所有数字都小于数组中的第一个数字。

但是正如丹尼尔的回答所示,您不需要检查“休息”后的所有数字,只需检查最后一个数字(这也恰好是休息后的最大/最大数字,因为它们已排序)。

应该总是有一个中断,除非列表中填充了相同的数字,在这种情况下没有中断并且计数将为 0。

【讨论】:

  • 小于或等于,但是是的。
  • @khuong291:不,你应该可以在一个循环中完成。
  • 我会首先找到最小的数字,然后检查所有后续数字是否都更大,但这也有效。
【解决方案2】:

以防一些用户想知道实现的样子。

public boolean isCircularSorted(int[] array)
{
    int size = array.length;
    int count = 0;

    for(int x=0; x<size; x++)
        if(array[x] > array[(x+1)%size])
            count ++;
    return (count <= 1);
}

用户 Daniel 也提到了这一点。

【讨论】:

  • 我不是投票者,但我猜他/她这样做是因为语法错误以及您的算法无法正常工作。
  • 好吧,假设您已经纠正了三个语法错误之一:P。丹尼尔斯算法仍然不(完全)正确。它有一个缺陷。
  • @SamuelO'Malley 我拒绝了您的编辑,因为您在编辑中建议的是我的初稿。 count 不一定必须是==0 || ==1。由于 count 永远不会低于 0,因此可以编写仅由 0 或 1 组成的 count &lt;= 1。for 循环的花括号也不需要。
  • 请忽略,我评论中的“算法缺陷”部分,问题在我这边:P.
  • @SamuelO'Malley 对于塞缪尔和汤姆:没问题 ;)
【解决方案3】:

正如@Daniel所说,使用value[i] &gt; value[(i+1)%length],如果是true我们就加1,如果末尾的count等于01,原来的array是循环排序数组!我觉得是个好办法!!

【讨论】:

  • 你是对的,这是一个很好的答案,但如果你要从评论中得到答案,我认为你应该尝试举一个例子或解释来说明它是如何工作的。这样大家就会明白了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 2013-08-09
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
相关资源
最近更新 更多