牛客网刷题遇到的部分笔试题

文章目录

数组元素交换

  • 题目
    牛牛有一个没有重复元素的数组a,他想要将数组内第n大的数字和第m大的数(从大到小排序)交换位置你能帮帮他吗。给定一个数组a,求交换第n大和第m大元素后的数组。
    示例:
输入:
[1,2],1,2

输出:
[2,1]
  • 解决代码
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);
    }
};

猜你喜欢

转载自blog.csdn.net/qq_41782149/article/details/107707618