2

ベクトルの k 番目に小さい要素を返すコードを作成しようとしています。例: 要素 {0, 3, 2, 5} を含むベクター rand があり、ユーザーが K の値として 2 を入力するとします。関数は、2 番目 (k 番目) であるため、ベクターから要素 2 を返す必要があります。 ) ベクトルの最小要素。

これまでのところ、これは私のコードです:

int iterative_kth_element(vector<int>& vec, size_t k)
{
    int index = 0;
    int min = vec[0];


    for(int i = k;i<vec.size();i--) {
            for (int j = 1; j < vec.size();j++) {
            if ( min > vec[j] ) {
                min = vec[j];
                index = i;
            }
        vec.erase(vec.begin() + index);

        if (i == 1) {
            return min;
        }

            }
    }

}

ベクトルにさえない巨大な数を返し続けます。

4

5 に答える 5

1

ここから始めてください: http://en.wikipedia.org/wiki/Selection_algorithm

int iterative_kth_element(vector<int>& vec, size_t k)
{
     int minIndex, minValue;
     for (int i = 0; i < k; i++)
     {
         minIndex = i;
         minValue = vec[i];
         for (int j = i+1; j < n; j++)
         {
             if (vec[j] < minValue)
             {
                 minIndex = j;
                 minValue = vec[j];
             }
         }
         int tmp = vec[i];
         vec[i] = vec[minIndex];
         vec[minIndex] = tmp;
     }
     return vec[k];
}
于 2013-10-18T00:14:04.537 に答える
1
for(int i = k;i<vec.size();i--)

kが常にであると仮定すると< vec.size()、条件i<vec.size()はここではまったく役に立たないようです。代わりに、次のように追加できます。

for(int i = k; i > 0; i--)

そして、ネストされたループは実際にはすべての要素をチェックする必要があるため、開始する必要があります0(最初の要素をスキップします):

for (int j = 0; j < vec.size(); j++) {
             ^

そして、私はそれを信じています

index = i;

意図されていた:

index = j;

そして、可能なすべての実行パスが何らかの値を返すことを確認し、コンパイラが表示する警告に注意してください。関数の最後にもう 1 つのreturnステートメントを追加します。

return min;

しかし、あなたの主な問題は次のとおりです。

  • minネストされたループが実行を開始する前に更新する必要があります
  • ネストされたループのスコープにerase呼び出しを含めないでください

試す:

int foo(std::vector<int>& vec, const size_t k)
{
    int index = 0;
    int min = -1;

    for(size_t i = 0; i < k; ++i) {
        if (vec.empty()) return min;
        min = vec[0];
        for (size_t j = 0; j < vec.size(); ++j) {
            if (vec[j] < min) {
                min = vec[j];
                index = j;
            }
        }
        vec.erase(vec.begin() + index);
    }
    return min;
}

int main() {
    int a[] = {0, 3, 2, 5};
    std::vector<int> v(a, a+4);
    std::cout << foo(v, 2);
}
于 2013-10-17T23:46:14.040 に答える
0

整数の配列が設定されます。

  1. 最大要素と最小要素の間に割り当てられたすべての正の要素を配列から削除します。

  2. 配列の負のセルの合計を計算します。

  3. 素数要素の最小値を計算するには

于 2014-01-07T21:01:12.767 に答える
0

1/ ベクトルがありますが、ほとんど配列としてのみ使用します

2/ イテレータの使用を検討してください。

3/ 参照としてベクトルを受け取っています。これは、要素の消去などの変更がメソッドの範囲外で有効であることを意味します。本当にそれを行いますか?

于 2013-10-18T00:12:16.003 に答える