由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 问一道kth smallest element的题目
相关主题
c++ 程序一问one c++ question
写了一个find kth number in 2 sorted arrays的code 请大牛看C的argc问题
问个c++题为什么我这段简单的程序segment fault
一道热门的 Google 面试题bloomberg assessment的机经,c语言的(20道题)
C++ Q83: 这个const_cast什么意思?C++ online Test 又一题
问个google面试题C++ 一题
真慫阿, Facebook 1st phone interview,这题哪错了?
你们看过programming pearls (2nd edition English) or 正在看的同学们这个看着很白痴的问题有更好的解法吗?
相关话题的讨论汇总
话题: int话题: indices话题: work话题: vector话题: const
进入JobHunting版参与讨论
1 (共1页)
g***j
发帖数: 1275
1
请问,一般题目问kth smallest element的题目,是返回那个数字还是返回那个数字在
原来数组中的index?
这个题目肯定要打乱原来的数组的顺序吧?如果是要返回原来数组中的index,怎么办?
m**a
发帖数: 139
2
放到一个{value,index}的struct里面然后再处理? 比较大小只比较value。

办?

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

g*********e
发帖数: 14401
3
再搜一遍呗 反正都是线性时间
p*i
发帖数: 411
4
#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<<(ostream& os, const vector& 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,怎么办?

g***j
发帖数: 1275
5
请问你的程序里面第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

p*i
发帖数: 411
6
main里面k从1开始,符合人的习惯
int pos = find_kthsmallest(A, k-1); <-- 我传了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];

g***j
发帖数: 1275
7
哦,这样子。

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

1 (共1页)
进入JobHunting版参与讨论
相关主题
这个看着很白痴的问题有更好的解法吗?C++ Q83: 这个const_cast什么意思?
帮看看这段code问个google面试题
leetcode上一题,求正解真慫阿, Facebook 1st phone interview,
一题你们看过programming pearls (2nd edition English) or 正在看的同学们
c++ 程序一问one c++ question
写了一个find kth number in 2 sorted arrays的code 请大牛看C的argc问题
问个c++题为什么我这段简单的程序segment fault
一道热门的 Google 面试题bloomberg assessment的机经,c语言的(20道题)
相关话题的讨论汇总
话题: int话题: indices话题: work话题: vector话题: const