【发布时间】:2014-02-10 04:43:46
【问题描述】:
我现在正在学习 codility。有些任务我可以自己解决,但有些任务有问题。 这个任务的难度是。它是中等的,但我停滞不前了。
问题:
给定一个由 N 个整数组成的非空零索引数组 A。 对于每个满足 0 ≤ i
A[0] = 3
A[1] = 1
A[2] = 2
A[3] = 3
A[4] = 6
对于以下元素:
A[0] = 3, the non-divisors are: 2, 6,
A[1] = 1, the non-divisors are: 3, 2, 3, 6,
A[2] = 2, the non-divisors are: 3, 3, 6,
A[3] = 3, the non-divisors are: 2, 6,
A[6] = 6, there aren't any non-divisors.
写一个函数:
class Solution { public int[] solution(int[] A); }
给定一个由 N 个整数组成的非空零索引数组 A,返回一个整数序列,表示非除数的数量。 该序列应返回为:
- 结构结果(在 C 中),
- 或整数向量(在 C++ 中),
- 或记录结果(帕斯卡),
- 或整数数组(在任何其他编程语言中)。
例如,给定:
A[0] = 3
A[1] = 1
A[2] = 2
A[3] = 3
A[4] = 6
该函数应返回 [2, 4, 3, 2, 0],如上所述。 假设:
- N 是 [1..50,000] 范围内的整数;
- 数组 A 的每个元素都是 [1..2 * N] 范围内的整数。
复杂性:
- 预计最坏情况时间复杂度为 O(N*log(N));
- 预期的最坏情况空间复杂度为 O(N),超出输入存储 (不包括输入参数所需的存储空间)。
输入数组的元素可以修改。
我已经写了一些解决方案。但是我的解决方案体积庞大,并且仍然具有 O(n^2) 复杂性。 你能帮我一些想法或算法如何以最佳方式做到这一点吗?这不是面试任务或其他什么。我只是在训练并尝试解决所有任务。 您可以在此处找到此任务:http://codility.com/demo/train/ 第 9 课,课程中的第一个任务。
谢谢!
【问题讨论】:
-
这听起来你应该把你的解决方案发布到Code Review 看看他们怎么说。
-
我的第一个想法是玩一下 Eratosthenes 的筛子,看看你是否可以通过按摩它来解决这个问题。我不是说这就是答案。我不知道答案是什么。这正是我的第一个想法。
-
@Keppil,我的解决方案很简单。用一些拐杖来解决问题以降低复杂性是显而易见的方法,但它不起作用。我没有一个好主意,所以我想专注于想法和算法,而不是代码。
标签: java arrays algorithm training-data