题目描述:
求数组中第k大的数。
思路:
快排思想。使用kuai分治每次将数组划分为两段,并且返回划分点的位置,如果这个位置恰好是我们要的第k大的数,那么返回这个数即可。 如果返回的位置小于要找的位置,则向右边的一半数组继续寻找。 如果返回的位置大于要找的位置,则向左边寻找。
代码:
class Solution
{
public
:
int partition(vector
<int>& nums
, int l
, int r
) {
int val
= nums
[r
];
for (int i
=l
; i
<r
; ++i
) {
if (nums
[i
] < val
) {
swap(nums
[l
++], nums
[i
]);
}
}
swap(nums
[l
], nums
[r
]);
return l
;
}
int findKthLargest(vector
<int>& nums
, int k
) {
int len
= nums
.size();
int l
= 0, r
= len
-1, pos
= len
- k
;
int ans
;
while((ans
= partition(nums
, l
, r
)) != pos
) {
ans
< pos
? l
= ans
+ 1 : r
= ans
- 1;
}
return nums
[pos
];
}
};
这道题放那三天了,我终于写了。 看论文看的脑壳痛,好不容易看完abstract和introduction,发现好像,还是啥也没看懂。 刷题刷题,不要懒啊。