请大家帮我看看哪里有问题,两个AC,三个WA
查看原帖
请大家帮我看看哪里有问题,两个AC,三个WA
1225607
Eleven_ZD楼主2024/3/10 23:25

//代码操作逻辑:选取输入序列中间数作为基准量,从两边向中间遍历

#include<bits/stdc++.h>

using namespace std;


void find_k(vector<int>& arr, int l, int r, int k)
{
    if (l >= r) return;

    int mid = arr[(l + r) / 2];
    int m = (l + r) / 2;//中间值下标 
    int i = l;
    int j = r;

    while (i < j)
    {
    	//从右边开始遍历 
        while (i < j && arr[j] >= mid) j--;
        if (arr[j] < mid)
        {
            swap(arr[j], arr[m]);
            m = j;
            j--;
        }

		// 从左边开始遍历
        while (i < j && arr[i] <= mid) i++;
        if (arr[i] > mid)
        {
            swap(arr[i], arr[m]);
            m = i;
            i++;
        }

    }

    if (k < m) find_k(arr, l, m - 1, k);		//k在左子序列 
    else if (k > m) find_k(arr, m + 1, r, k);	//k在右子序列
    else return;
}

int main ()
{
	int n,k;
	
	scanf("%d%d",&n,&k);
	
	vector<int> arr(n);
	
	for(int i=0;i<n;i++)
	{
		scanf("%d",&arr[i]);
	}
	
	find_k(arr,0,n-1,k);
	
	printf("%d",arr[k]);
	
	return 0;
}
2024/3/10 23:25
加载中...