给定一个整数N,任务是生成一个长度为N的数组A[],使其满足所有1≤i≤N-1的下列条件。
- 当i为奇数时,Ai是Ai-1的倍数
- 当i是偶数时,Ai 不是Ai-1的倍数
- 所有的Ai都是成对不同的
- 1 ≤Ai≤ 2⋅N
注意:如果有多个答案,请打印其中任何一个。
例子。
输入。 N = 4
**输出。**3 6 4 8
解释。 [3, 6, 4, 8]是一个有效的数组,因为:
A1 = 3 是 A2 = 6 的倍数
A2 = 6 不是 A3 = 4 的倍数
A3 = 4 是 A4 = 8 的倍数。**输入。**N = 6
输出。 4 8 5 10 6 12
办法:根据以下观察,可以解决这个问题。
观察到的情况。
让x = N - ⌈N / 2⌉ + 1。那么,下面的序列是有效的。[x, 2⋅x, x + 1, 2⋅(x + 1), x + 2, ...] 。
- 很容易看出,奇数索引的元素从x→N开始依次递增。同样地,偶数索引的元素从2⋅x→2⋅N(当N为奇数时从2⋅x→2⋅(N-1))依次递增。
- 那么,2⋅x = 2⋅(N - ⌈N / 2⌉ + 1) > N意味着集合{x, x + 1, ..., N}和{2⋅x, 2⋅(x + 1), ..., 2⋅N}是不相连的。因此,上述序列的所有元素都是唯一的。
- Ai是Ai-1的倍数可以被琐碎地验证为对所有奇数
Ai不是Ai-1的倍数对所有偶数i都成立。因此,所提供的序列满足了问题的所有要求,因此是有效的!
按照下面的步骤来解决这个问题。
- 初始化一个变量oddElement = (N / 2) + 1,用于奇数索引元素。
- 初始化一个变量evenElement = oddElement * 2用于偶数索引元素。
- 在i上从1到N进行一次循环。
- 如果i是奇数,打印奇数元素。
- 指定evenElement = oddElement * 2。
- 递增evenElement。
- 否则打印evenElement。
- 如果i是奇数,打印奇数元素。
下面是上述方法的实现。
java
// Java code to implement the approach
import java.io.*;
import java.util.*;
public class GFG {
// Function to find array
public static void find(int N)
{
int oddElement = N - (int)Math.floor(N / 2) + 1;
int evenElement = 2 * oddElement;
for (int i = 1; i <= N; i++) {
// For odd indices
if ((i % 2) != 0) {
System.out.print(oddElement + " ");
evenElement = 2 * oddElement;
oddElement++;
}
// For even indices
else {
System.out.print(evenElement + " ");
}
}
}
// Driver code
public static void main(String[] args)
{
int N = 4;
// Function call
find(N);
}
}
输出
3 6 4 8
时间复杂度。O(N)
辅助空间。 O(1)