使所有数字大于或等于K所需的最小交换

时间:2018-02-18 10:44:07

标签: algorithm data-structures

给定一系列 N 数字和数字 K 。找到将所有数字大于或等于一起带到 K 所需的最小互换次数。

输入格式:

第一行包含一个整数N,表示数组中元素的数量

第二行包含N个以空格分隔的整数,表示数组的元素。

Sample Input:                                  Sample Output:
5 3                                            1
5 2 1 3 4

3 个答案:

答案 0 :(得分:0)

您可以按照以下方式执行此操作:

  • 计算值的数量> = K,称之为C
  • 计算多少个值<数组的前C个元素中的K:如果我们的目标是将所有值> = K分组在数组的最左侧,则表示要交换的值的数量
  • 从该窗口中删除最左侧的值,并在其右侧添加下一个值,将窗口大小保持为C.相应地调整交换次数。
  • 继续向右移动窗口并跟踪任何这些配置中的最小交换次数。

以下是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”。这将是最终答案。