【问题标题】:Is there a more efficient form of sorting this array than bubblesort given the problem criteria?考虑到问题标准,是否有比冒泡排序更有效的排序数组形式?
【发布时间】:2019-10-21 02:10:51
【问题描述】:

我在HackerRank上练习了更多的问题,我遇到了一个叫做“新年混乱”的问题。基本上前提是对数组进行排序并计算所做的开关。关键是没有数字被允许超过2个开关。 BubbleSort 通过了前几个测试,但在其余测试中超时。是否有更有效的数组排序算法仍然考虑到开关的数量?我尝试了 mergeSort 和 quickSort,但是在这样划分数组时很难跟踪开关。

问题提示: 这是元旦,每个人都在排队参加仙境过山车!排队的人很多,每个人都贴着一张贴纸,标明他们在队列中的初始位置。初始位置从行的前面到后面递增。

队列中的任何人都可以贿赂直接排在他们前面的人以交换位置。如果两个人交换位置,他们仍然会佩戴相同的标签,表示他们原来的位置。一个人最多可以贿赂另外两个人。例如,如果 n = 8 且第 5 个人贿赂第 4 个人,则队列将如下所示:{1, 2, 3, 5, 4, 6, 7, 8}。

对这个混乱的队列着迷,您决定必须知道为使队列进入当前状态而发生的最低贿赂次数!

public class LineBribing {

    static int[] replace(int[] q, int i, int n) {
        int temp = q[i];
        q[i] = q[n];
        q[n] = temp;
        return q;
    }

    static void minimumBribes(int[] q) {
        int count = 0;
        for (int i = 0; i < q.length - 1; i++) {
            if (q[i] > i + 3 || q[i] < i - 1) {
                System.out.println("Too chaotic");
                return;
            }
            if (q[i] > q[i + 1]) {
                count++;
                replace(q, i, i + 1);
                i = 0;
            }
        }
        System.out.println(count);
    }

    public static void main(String[] args) {
        int[] test = {1, 2, 5, 3, 4, 7, 8, 6};
        int[] test2 = {1, 2, 5, 3, 7, 8, 6, 4};
        minimumBribes(test);
        minimumBribes(test2);

    }
}

鉴于 main 方法中的输入,测试 1 的输出应为 4(开关:5、3 在 index = 3 | 5、4 在 index = 4 | 8、6 在 index = q.length - 1 | 7, 6 at index = q.length - 2) 和测试 2 的“太混乱”(因为 5 > 2 从其初始位置切换)

【问题讨论】:

    标签: java arrays bubble-sort


    【解决方案1】:

    我认为这个问题不需要对数组进行排序。您只需要计算超过一个人的人数。请注意:

    • 一个人最多可以贿赂 2 个不同的人
    • 一个人可以贿赂在他面前的人 因此,您应该首先判断任何人贿赂超过 2 人。然后统计超车人数。

    我的 Java 代码是这样的:

            int ans = 0;
            for (int i = q.length - 1; i >= 0; i--) {
                if (q[i] - (i + 1) > 2) {
                    System.out.println("Too chaotic");
                    return;
                }
                for (int j = Math.max(0, q[i] - 2); j < i; j++) {
                    if (q[j] > q[i]) {
                        ans++;
                    }
                }
            }
            System.out.println(ans);
    

    【讨论】:

    • 啊,我明白了@Jackeyzhe!所以你真的不需要移动值,只要你计算出一个人领先于他们的指数多远
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 2016-02-10
    • 1970-01-01
    • 2021-12-15
    • 2016-09-07
    • 1970-01-01
    相关资源
    最近更新 更多