avatar
g*j
1
请问,一般题目问kth smallest element的题目,是返回那个数字还是返回那个数字在
原来数组中的index?
这个题目肯定要打乱原来的数组的顺序吧?如果是要返回原来数组中的index,怎么办?
avatar
m*a
3
放到一个{value,index}的struct里面然后再处理? 比较大小只比较value。

办?

【在 g***j 的大作中提到】
: 请问,一般题目问kth smallest element的题目,是返回那个数字还是返回那个数字在
: 原来数组中的index?
: 这个题目肯定要打乱原来的数组的顺序吧?如果是要返回原来数组中的index,怎么办?

avatar
g*e
4
再搜一遍呗 反正都是线性时间
avatar
p*i
5
#include
#include
#include
#include
using namespace std;
inline void swap(int &a, int &b) {
int t = a; a = b; b = t;
}
int partition(vector& work, vector& indices, int p, int q) {
// use work[q] to partition the array
const int x = work[q];
int i = p-1;
for (int j = p; j < q; j++) {
if (work[j] < x) {
i++;
swap(work[i], work[j]);
swap(indices[i], indices[j]);
}
}
i++;
swap(work[i], work[q]);
swap(indices[i], indices[q]);
return i;
}
int find_kthsmallest(const vector& A, int k) {
const int n = A.size();
assert((k >= 0) && (k < n));
int p = 0, q = n-1;
vector work(A), indices;
for (int i = 0; i < n; i++)
indices.push_back(i);
while (p < q) {
int r = partition(work, indices, p, q);
if (r-p == k) return indices[r];
else if (r-p < k) {
p = r+1;
k -= (r-p+1);
} else q = r-1;
}
return indices[p];
}
ostream& operator<& A) {
for (int i = 0; i < A.size()-1; i++)
cout << A[i] << ' ';
cout << A[A.size()-1];
return os;
}
int main(int argc, char** argv) {
const int n = argc-2;
vector A;
for (int i = 2; i <= n+1; i++)
A.push_back(atoi(argv[i]));
const int k = atoi(argv[1]);
cout << A << endl;
cout << k << "th smallest element is: ";
int pos = find_kthsmallest(A, k-1);
cout << A[pos] << " at " << pos << endl;
return 0;
}

办?

【在 g***j 的大作中提到】
: 请问,一般题目问kth smallest element的题目,是返回那个数字还是返回那个数字在
: 原来数组中的index?
: 这个题目肯定要打乱原来的数组的顺序吧?如果是要返回原来数组中的index,怎么办?

avatar
g*j
6
请问你的程序里面第k小,是从多少开始的? 第一个是k 为0还是k为1
这个partition返回的r是index吧?
如果k 的最小值为 1,就是最小的值
这句话不对吧?
int r = partition(work, indices, p, q);
if (r-p == k) return indices[r];
个人觉得应该是
if (r-p+1 == k) return indices[r];

【在 p*i 的大作中提到】
: #include
: #include
: #include
: #include
: using namespace std;
: inline void swap(int &a, int &b) {
: int t = a; a = b; b = t;
: }
: int partition(vector& work, vector& indices, int p, int q) {
: // use work[q] to partition the array

avatar
p*i
7
main里面k从1开始,符合人的习惯
int pos = find_kthsmallest(A, k-1); 其它函数都是c++默认的从0开始,符合语言本身习惯
虽然这样没有必要。

【在 g***j 的大作中提到】
: 请问你的程序里面第k小,是从多少开始的? 第一个是k 为0还是k为1
: 这个partition返回的r是index吧?
: 如果k 的最小值为 1,就是最小的值
: 这句话不对吧?
: int r = partition(work, indices, p, q);
: if (r-p == k) return indices[r];
: 个人觉得应该是
: if (r-p+1 == k) return indices[r];

avatar
g*j
8
哦,这样子。

【在 p*i 的大作中提到】
: main里面k从1开始,符合人的习惯
: int pos = find_kthsmallest(A, k-1); : 其它函数都是c++默认的从0开始,符合语言本身习惯
: 虽然这样没有必要。

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。