我有一个包含N
元素的数组,我有M
个数字。你需要在数组中排列M(1,2,3,......)数字,重复M中的数字。这样阵列中的构成元素就不一样了。
例如:N=9
和M=3
[4, 4, 1]
表示1在数组中出现4次,“2”出现4次,3次只出现一次。
所以可能的安排是[1,2,1,2,1,2,3,1,2]
。
例如:N=8
和M=2
[3, 5]
。
不可能将元素排列成两个连续元素不相同。
我需要找到安排 可能与否的天气。
答案 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