Pregunta : Niuniu tiene una matriz a sin elementos repetidos. Quiere intercambiar las posiciones del n-ésimo número más grande y el m-ésimo número más grande en la matriz (ordenados de mayor a menor). ¿Puedes ayudarlo? Dada una matriz a, encuentre la matriz después de intercambiar el n-ésimo elemento más grande y el m-ésimo elemento más grande. Ejemplo:
输入:
[1,2],1,2
输出:
[2,1]
Resuelve el código
class Solution {
public:
/**
*
* @param a int整型vector 原始数组a
* @param n int整型 第n大
* @param m int整型 第m大
* @return int整型vector
*/
vector<int> sovle(vector<int>& a, int n, int m) {
// write code here
int s = a.size();
vector<int> temp(a);
int p_1 = findKthElement(temp, 0, s - 1, s - m);
int p_2 = findKthElement(temp, 0, s - 1, s - n);
int p1, p2;
for(int i = 0; i < s; i++){
if(a[i] == p_1)
p1 = i;
else if(a[i] == p_2)
p2 = i;
}
swap(a[p1], a[p2]);
return a;
}
int partition(vector<int> &a, int l, int r){
int v = a[l];
//[l+1, ... , j] < v. [j + 1, ... , r] > v
int j = l;
for(int i = l + 1; i <= r; i++){
if(a[i] < v){
swap(a[++j], a[i]);
}
}
swap(a[l], a[j]);
return j;
}
int findKthElement(vector<int> &a, int l, int r, int k){
if(l == r)
return a[l];
int p = partition(a, l, r);
if( p == k)
return a[p];
if(p > k){
return findKthElement(a, l, p - 1, k);
}
else
return findKthElement(a, p + 1, r, k);
}
};