【问题标题】:largest number with each digit only swap at-most K times and only adjacent swap每个数字的最大数字最多只交换K次并且只交换相邻的交换
【发布时间】:2020-10-16 15:18:31
【问题描述】:

我进行了测试,但有一个问题我仍然无法解决。
给定一个数字数组,每个元素最多允许 K 次交换,并且只允许相邻交换,找到最大的字典顺序。
例如:

Input
[7, 1, 2, 3, 4, 5, 6]
swapTime = 2

Output
[7, 3, 4, 1, 2, 6, 5]

起初我以为是修改后的 BubbleSort,但它不正确,有什么想法吗? 伪代码如下:

void findMaxNum(int num[], int swapTime) {
    int table[n];
    for(i=0; i<n; ++i) 
        table[i] = swapTime;

    for(i=0; i<n-1; ++i)
        for(j=0; j<n-i-1; ++j)
            if(table[j]!=0 && num[j]<num[j+1]) {
                swap(num[j], num[j+1]);
                swap(table[j], table[j+1]);
                table[j]--;
                table[j+1]--;
            }
}

【问题讨论】:

  • 数组大小和交换有什么限制?
  • 数组大小:1
  • 所以swapTime 是每个元素可以移动多少次,而不是交换总数?
  • 贪婪的方法怎么样?对于您的输出,请尽可能执行在output[0] 中获得最大数字的操作,然后执行在output[1] 中获得最大数字的操作,重复整个输出

标签: c++ arrays algorithm


【解决方案1】:

您可以使用大小为 k+1 的最大堆,最初具有前 k+1 个值以及从每个索引到该索引最左侧合法元素的哈希(忽略索引

然后我们按升序对每个索引 i 执行以下操作:

如果 hash[i] 有一个值,把它放在 i 处,然后从堆中删除。如果不是,则将最大 elt 从堆中移至 i 并将其从散列中删除。在任何一种情况下,将数组中的下一个 elt 添加到堆中。

哈希保证没有元素向右移动超过 k。最小堆选择最大合法元素,同时保证没有元素向左移动超过k。

【讨论】:

    【解决方案2】:

    对于字典顺序,您必须最大化第一个字母,然后是第二个,依此类推。因此,只要有助于改善当前位置(从左到右)并且不超过 k,您就不必担心在数字上使用交换。这是一个解决方案(也像您的方法一样修改输入):

    public static void findMax(int[] num, int swapsPerElement) {
        int[] swaps = new int[num.length];
        for (int i = 0; i < num.length; i++) {
            if (swaps[i] == swapsPerElement)
                continue;
            int best = i;
            for (int j = i + 1; j < num.length && j - i <= swapsPerElement; j++) {
                if (swaps[j] == swapsPerElement)
                    break; // cannot be swapped
                if (num[best] < num[j] && swapsPerElement - swaps[j] >= j - i)
                    best = j;
            }
            for (int j = best; j > i; j--) { // swap
                int t = swaps[j] + 1;
                swaps[j] = swaps[j - 1] + 1;
                swaps[j - 1] = t;
                t = num[j];
                num[j] = num[j - 1];
                num[j - 1] = t;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-11-14
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-08
      • 1970-01-01
      • 2020-04-22
      • 1970-01-01
      相关资源
      最近更新 更多