【求助】不加随机数会TLE?
查看原帖
【求助】不加随机数会TLE?
8513
DataSailor楼主2024/4/15 14:30

这份代码基于Quick Sort。已经过了,但是需要添加随机数。

在没有随机数的情况下,#3和#4会TLE。在隔壁力扣也是一样。

请大佬们帮忙看看,是毒瘤数据还是我写出问题了?

#include <iostream>
#include <vector>
#include <random>
using std::vector;

std::mt19937 rand_gen(std::random_device{}());

class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
        quick_sort(nums, 0, nums.size());
        return nums;
    }

    void quick_sort(vector<int>& nums, uint const begin, uint const end) {
        if(begin + 1 >= end)
            return;
        std::uniform_int_distribution<uint> rd(begin, end-1);
        std::swap(nums[begin], nums[rd(rand_gen)]); //随机选择middle value, 删除会TLE
        uint left = begin, mid = begin + 1,right = begin + 1; 
        // 在[begin,left)维护小于val的序列,在[left,mid)维护等于val的序列,在[mid,right)维护大于val的序列,right右侧为待处理序列
        for(int val = nums[begin]; right < end; right++)
            if(nums[right] == val) {
                std::swap(nums[mid], nums[right]);
                mid++;
            }
            else if(nums[right] < val) {
                std::swap(nums[mid], nums[right]);
                std::swap(nums[left], nums[mid]);
                left++;
                mid++;
            }
            // 每次右移right处理一个数,如果大于val就什么都不用做,等于val则移到mid最后一个,小于val则移到left最后一个。
        quick_sort(nums, begin, left);
        quick_sort(nums, mid, end);
    }

};
int main() {
    int n;
    scanf("%d", &n);
    std::vector<int> nums(n);
    for(int i = 0; i < n; ++i)
        scanf("%d", &nums[i]);
    Solution solve;
    solve.sortArray(nums);
    for(auto const e:nums)
        printf("%d ",e);
    return 0;
}
2024/4/15 14:30
加载中...