给定一系列 N 数字和数字 K 。找到将所有数字大于或等于一起带到 K 所需的最小互换次数。
输入格式:
第一行包含一个整数N,表示数组中元素的数量
第二行包含N个以空格分隔的整数,表示数组的元素。
Sample Input: Sample Output:
5 3 1
5 2 1 3 4
答案 0 :(得分:0)
您可以按照以下方式执行此操作:
以下是JavaScript中的交互式实现:
function solve(a, k) {
let count, i, swaps, leastSwaps;
// 1. Count number of elements >= k:
count = 0;
for (i = 0; i < a.length; i++) {
if (a[i] >= k) count++;
}
// 2. Count number of elements < k in first "window":
// These would need to be swapped.
swaps = 0;
for (i = 0; i < count; i++) {
if (a[i] < k) swaps++;
}
leastSwaps = swaps;
// 3. Slide window to the right minimising number of swaps
for (i = 0; i < a.length - count; i++) {
if (a[i] < k) swaps--;
if (a[i+count] < k) swaps++;
if (swaps < leastSwaps) leastSwaps = swaps;
}
return leastSwaps;
}
// I/O management
function process() {
const a = arrayInput.value.match(/\d+/g).map(Number),
k = +pivotInput.value;
result.textContent = solve(a, k);
}
arrayInput.oninput = pivotInput.oninput = process;
// Launch on page load
process();
<table>
<tr><td>Numbers:</td><td><input id="arrayInput" size="40" value="5 2 1 3 4" ></td></tr>
<tr><td>K:</td><td><input id="pivotInput" size="4" value="3"></td></tr>
<tr><td>Swaps:</td><td><span id="result">?</span></td></tr>
</table>
答案 1 :(得分:0)
答案已经是正确的,但是我想提供该程序为何起作用的逻辑: 下划线原则:在存在最大元素数大于或等于k的最小子数组中,将要求最小交换。
最小子数组的大小应该是多少?应该是大于或等于k的元素总数。这是有道理的,因为假设所有大于或等于k的元素都在一起,则子数组的大小不能小于此值。
在给定数组中,子数组中具有条件的元素最少的是我们的子数组,而违反条件的元素的数量是答案,因为这些违规需要交换为正确的
答案 2 :(得分:0)
找出所有小于或等于‘k’的元素的数量。假设计数是“cnt” 对长度为“cnt”的窗口使用两个指针技术,每次跟踪该范围内有多少元素大于“k”。假设总计数为“var1”。 对每个长度为“cnt”的窗口重复步骤 2,并在其中取最小计数“var1”。这将是最终答案。