当前位置: 首页 > 知识库问答 >
问题:

寻找最小字典式数组

连昊天
2023-03-14

我试图解决这个面试问题。我的代码针对测试用例运行,但对于所有实际输入测试用例都失败。我努力寻找错误,但无法做到。请在问题下方找到我的代码

鲍勃非常喜欢分类。他总是在想新的方法来对数组进行排序。他的朋友拉姆给了他一项艰巨的任务。他给了Bob一个数组和一个整数K。挑战是在最多K-swap之后生成字典序最小数组。只能交换连续的元素对。帮助Bob在最多K-swap之后返回字典序最小数组。

输入:第一行包含一个整数T,即测试用例的数量。T测试用例紧随其后。每个测试用例有2行。第一行包含N(数组中元素的数量)K(交换的数量)。第二行包含n数组的整数。

输出:打印字典最小数组。

约束条件:

1 <= T <= l0 

1 <= N,K <= 1000 

1 <= A[i] <= 1000000 

示例输入(纯文本链接)

2 

3 2 

5 3 1 

5 3 

8 9 11 2 1 

样本输出(纯文本链接)

1 5 3 

2 8 9 11 1 

说明

交换1后:

5 1 3 

交换2后:

1 5 3 

< code>{1,5,3}在字典上比< code>{5,1,3}小

示例 2:

交换1: 8 9 2 11 1

交换2:8 2 9 11 1

交换 3: 2 8 9 11 1

  #include <iostream>
  using namespace std;

  void trySwap(int a[], int start, int end, int *rem)
  {
//cout << start << "  " << end << "  " << *rem << endl;
  while (*rem != 0 && end > start)
  {
    if (a[end - 1] > a[end])
    {
        swap(a[end - 1], a[end]);
        (*rem)--;
        end--;
    }
    else end--;
}
}

void getMinimalLexicographicArray(int a[], int size, int k)
{
int start , rem = k, window = k;

for (start = 0; start < size; start++)
{
    window = rem;
    if (rem == 0)
        return;
    else
    {
        //cout << start << " " << rem << endl;
        int end = start + window;
        if (end >= size)
        {
            end = size - 1;
        }
        trySwap(a, start, end, &rem);
    }
}
}

int main()
{
int T, N, K;
int a[1000];
int i, j;

cin >> T;
for (i = 0; i < T; i++)
{
    cin >> N;
    cin >> K;

    for (j = 0; j < N; j++)
    {
        cin >> a[j];
    }

    getMinimalLexicographicArray(a, N, K);

    for (j = 0; j < N; j++)
        cout << a[j] << " ";
    cout << endl;

}

return 0;

}

共有2个答案

万俟穆冉
2023-03-14

下面是两个失败的测试用例。

2

2 2
2 1

5 3
3 2 1 5 4

首先,您的代码不进行交换,因为 K

编辑:新版本还是太贪心了。的正确输出

1

10 10
5 4 3 2 1 10 9 8 7 6

1 2 3 4 5 10 9 8 7 6

.

丘学海
2023-03-14

Python解决方案可以很容易地翻译成C:

def findMinArray(arr, k):
  i = 0
  n = len(arr)

  while k > 0 and i < n:
    min_idx = i

    hi = min(n, i + k + 1)

    for j in range(i, hi):
      if arr[j] < arr[min_idx]:
        min_idx = j

    for j in range(min_idx, i, -1):
      arr[j - 1], arr[j] = arr[j], arr[j - 1]

    k -= min_idx - i
    i += 1

  return arr
 类似资料:
  • 下面是寻找最小跳跃次数的算法谜题。发布了详细的问题声明和两个代码版本来解决这个问题。我做了测试,似乎两个版本都可以工作,我的第二个版本是版本一代码的优化版本,这使得我从开始,而不是持续增加,这可以通过不迭代所有的插槽来节省时间数组。 我的问题是,想知道我的第二个版本代码是否100%正确?如果有人发现任何逻辑问题,请指出。 问题陈述 给定一个非负整数数组,您最初位于数组的第一个索引处。 数组中的每个

  • 如何在数据集中找到几个最小值中的第一个?我希望至少2大于最小值。 例如, 我想将df['value'][0]或者简单地说(0.6)标识为这个数组中的第一个最小值。然后将df[‘值’][4]或(2.8)确定为至少比第一个确定的最小值(0.6)大2的值。 这适用于其他数据集,但在最小值为第一个时不适用。 理想的输出是: 正如评论中建议的那样,循环将是更好的方法。

  • 题目描述 输入n个整数,输出其中最小的k个。 分析与解法 解法一 要求一个序列中最小的k个数,按照惯有的思维方式,则是先对这个序列从小到大排序,然后输出前面的最小的k个数。 至于选取什么的排序方法,我想你可能会第一时间想到快速排序(我们知道,快速排序平均所费时间为n*logn),然后再遍历序列中前k个元素输出即可。因此,总的时间复杂度:O(n * log n)+O(k)=O(n * log n)。

  • 给定一个由N个正整数组成的数组,从索引0到N-1,我如何才能找到一个长度为K且范围尽可能小的连续子数组。换句话说,最大(子阵列)-最小(子阵列)是最小化的。如果有多个答案,任何答案都可以。 例如,从[4,1,2,6]中找到最小范围的长度为2的子数组 答案是[1,2],因为2-1=1给出了所有可能的连续子数组的最小范围。 其他子阵列有[4,1](范围3),[2,6](范围4) 我正在使用python

  • 我有一个熊猫数据框,有两列,一列是温度,另一列是时间。 我想做第三和第四列,叫做最小和最大。这些列中的每一个都将填充nan's,除非有一个局部min或max,那么它将具有该极值的值。 这里是一个数据的样本,本质上我试图识别图中所有的峰值和低点。 有没有内置的熊猫工具可以做到这一点?

  • 题目描述 给定若干整数,请设计一个高效的算法,确定第k小的数。 输入格式: 测试数据有多组,处理到文件尾。每组测试数据的第1行输入2个整数n,k(1≤k≤n≤1000000)。第2行输入n个整数,每个数据的取值范围在0到1000000之间。 输出格式: 对于每组测试,输出第k小的数。 输入样例: 5 3 1 2 2 2 1 9 3 1 2 3 4 5 6 9 8 7 输出样例: 2 3 提示: 如