【问题标题】:How can I get this program to run in linear-time?我怎样才能让这个程序在线性时间内运行?
【发布时间】:2017-02-02 12:01:21
【问题描述】:

所以我这几天一直在处理一个作业问题,我发现让这个程序在线性时间内运行非常困难。我已经让它在 O(n^2) 中工作,但我想得到一个完美的分数。

这是一个问题: 我们被要求将某些数字的重复项更改为负数,然后将所有重复项发送到数组的末尾。

  For example, if the input array is [ 4 , 1 , 1 , 3 , 3 , 3 , 1 , 1 ], it
  reads [ 4 , 1 , 3 , 1 , -1 , -1 , -1 , -1 ] after squeeze() completes.

这是我的程序:

int base = ints[ints.length -1];
    int count = 0;
    for (int i = ints.length - 1 ; i > 0 ; i--)
    {
        if (base == ints[i-1])
        {
            ints[i] = N_ONE;
            count++;
        } else {
            base = ints[i-1];
        }
    }
    int count2 = 0;
    for (int j = 0; (count) != count2 ; j++)
    {
        if (ints[j] == -1 && ints[j+1] != -1)
        {
            ints[j] = ints[j+1];
            ints[j+1] = N_ONE;
            count2 = 0;
            j = 0;
        } else if (ints[j] == -1 && ints[j+1] == -1){
            count2++;
        }
    }
}

我的第一个循环有效地工作,它将所有重复的数字设置为 -1,但是我的第二个循环不仅不在线性运行时,而且我觉得它可以以更简单的方式完成。我试过手动写出这些过程,但我似乎仍然只想出 O(n^2) 的方法。

有没有人有建议或提示?有什么很简单的东西我错过了吗?

提前致谢!

【问题讨论】:

  • 一次性完成,为您正在阅读和写作的每个位置使用索引。仅写入一次以读取重复块。当你用完读取元素时,只需用 -1 填充数组的其余部分。
  • 要在 O(n) 时间内查找重复项,请使用 HashSet<Integer>

标签: java arrays loops runtime computer-science


【解决方案1】:

正如我在评论中所建议的那样,此解决方案背后的概念是:一次性完成,为您正在阅读和写作的每个位置使用一个索引。仅写入一次以读取重复块。当你用完读取元素时,只需用 -1 填充数组的其余部分。

这是一个 Java 实现。如您所见,我没有做太多测试。

import java.util.Arrays;

public class Test {
  public static void main(String[] args) {
    testIt(new int[]{});
    testIt(new int[]{4, 1, 1, 3, 3, 3, 1, 1});
    testIt(new int[]{1});
    testIt(new int[]{1,1});
    testIt(new int[]{1,2});
  }

  public static void testIt(int[] in) {
    System.out.println(Arrays.toString(in));
    squeeze(in);
    System.out.println(Arrays.toString(in));
    System.out.println();
  }

  public static void squeeze(int[] data) {
    int readIndex = 0;
    int writeIndex = 0;
    while(readIndex < data.length){
      if(readIndex == 0 || data[readIndex] != data[readIndex-1]){
        // Need to store this one
        data[writeIndex] = data[readIndex];
        writeIndex++;
      }
      readIndex++;
    }
    while(writeIndex < data.length){
      data[writeIndex] = -1;
      writeIndex++;
    }
  }
}

【讨论】:

  • 您所做的测试是在此处发布答案的绝大多数人的无数倍。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 2020-10-22
  • 1970-01-01
  • 2021-05-27
相关资源
最近更新 更多