元素的排列,以避免重复的连续位置

时间:2014-08-31 16:50:59

标签: arrays

我有一个包含N元素的数组,我有M个数字。你需要在数组中排列M(1,2,3,......)数字,重复M中的数字。这样阵列中的构成元素就不一样了。

例如:N=9M=3 [4, 4, 1]表示1在数组中出现4次,“2”出现4次,3次只出现一次。

所以可能的安排是[1,2,1,2,1,2,3,1,2]

例如:N=8M=2 [3, 5]

不可能将元素排列成两个连续元素不相同。

我需要找到安排 可能与否的天气。

1 个答案:

答案 0 :(得分:0)

尝试类似这样的东西(Java语法):

int max = M[0];
int sum = M[0];
for ( i = 1 ; i < M.length ; i++ ) {
    if ( M[i] > max ) {
        max = M[i];
    }
    sum = sum + M[i];
}

if ( 2*max <= s+1 ) {
    System.out.println("possible");
} else {
    System.out.println("NOT possible");
}

时间复杂度:O(| M |)


这个想法是,如果你想把这些数字放到一个数组中,你将从最长的序列开始,然后你选择第一个最长的序列,以避免重复。

E.g.:
----------- arr: []
1, 1, 1, 1
2, 2
3
----------- arr: [1]
1, 1, 1
2, 2
3
----------- arr: [1, 2]
1, 1, 1
2
3
----------- arr: [1, 2, 1]
1, 1
2
3
----------- arr: [1, 2, 1, 2]
1, 1
3
----------- arr: [1, 2, 1, 2, 1]
1
3
----------- arr: [1, 2, 1, 2, 1, 3]
1
----------- arr: [1, 2, 1, 2, 1, 3, 1]

因此,如果M中的最大数量最多是其他数字+ 1的总和,则可以获得不重复的数组:

max <= sum_of_the_others + 1      | + max

相当于

max + max <= sum_of_all_numbers + 1

相当于

2*max <= sum_of_all_numbers + 1