繁体   English   中英

函数在使用集合时返回错误的第 k 个值

[英]Function returning the wrong kth value while using sets

我试图在某个网站上解决这个问题,在那里你可以找到 c++ 中的第 k 个最小值,所以我想出了:

#include <bits/stdc++.h>
using namespace std;
int kthSmallest(int arr[], int l, int r, int k) {

    // l is the first index 
    // r is the index of the last element (size - 1)
    // k is the kth smallest value 
    set<int> s(arr, arr + r); 

    
    set<int>:: iterator itr = s.begin();
    advance(itr, (k - 1));
    
    return *itr;
}
int main() {
  int arr[] = {7, 10, 4, 20, 15};
  cout << kthSmallest(arr, 0, 4, 4);
  return 0;
}

这显示了 20 而不是 15 的输出,这是正确的答案,我无法弄清楚我在这里做错了什么。

std::set构造函数的第二个参数应该是最后一个元素旁边的元素的迭代器,而不是最后一个元素的迭代器。

因此,您正在使用成员为{7, 10, 4, 20}的集合进行操作。

线

set<int> s(arr, arr + r);

应该

set<int> s(arr, arr + r + 1);

或(以匹配评论)

set<int> s(arr + l, arr + r + 1);

此语句中的范围

set<int> s(arr, arr + r);

此数组的r等于4时指定错误

int arr[] = {7, 10, 4, 20, 15};

有5个元素。 这意味着15不在[7, 10, 4, 20]范围内。 您必须指定参数r等于5 ,即数组中元素的数量,而不是4

函数中也没有使用参数l

并且您需要检查k的值是否不大于r调用函数std::advance的值。

还要注意数组可以有重复的值。 在这种情况下,函数可能会返回不正确的值。

所以一般来说你的功能是不正确和不安全的。

与其返回int类型的对象,不如返回指向数组中目标对象或范围末尾或目标元素索引的迭代器。

使用您的方法,您应该使用std::multiset而不是std::set 并且k的值应该从0开始,作为 C++ 中的所有索引。 否则调用k值等于0的函数,您将得到未定义的行为。

这是一个演示程序。

#include <iostream>
#include <functional>
#include <set>
#include <iterator>

size_t kthSmallest( const int arr[], size_t n, size_t k ) 
{
    if ( not ( k < n ) ) return n;

    std::multiset<std::reference_wrapper<const int>> s;

    for ( size_t i = 0; i < n; i++ )
    {
        s.insert( std::ref( arr[i]) );
    }

    auto it = std::next( std::begin( s ), k );

    size_t result = std::distance( arr, &it->get() );

    return result;
}    

int main() 
{
    int arr[] = {7, 10, 4, 20, 15};
    const size_t N = sizeof( arr ) / sizeof( *arr );

    for ( size_t i = 0; i < N; i++ )
    {
        std::cout << i << ": " << arr[kthSmallest( arr, N, i )] << '\n';
    }

    return 0;
}

程序输出为

0: 4
1: 7
2: 10
3: 15
4: 20

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM