0
点赞
收藏
分享

微信扫一扫

API 数据接口使用与安全指南

若如初梘 2024-12-04 阅读 12

目录

颜色分类

题目解析

在这里插入图片描述

算法原理

在这里插入图片描述

代码

class Solution 
{
public:
    void sortColors(vector<int>& nums) 
    {
        // 三指针,数组分成三块
        int left = -1,i = 0,right = nums.size();
        // i == right结束循环
        // 0 1 2 left边缘到右边 right边缘到左边
        while(i < right)
        {
           if(nums[i] == 0)
           swap(nums[++left],nums[i++]);
           else if(nums[i] == 1)
           i++;
           else
           swap(nums[--right],nums[i]);
        }
    }
};

排序数组

题目解析

在这里插入图片描述

算法原理

在这里插入图片描述

代码

class Solution 
{
public:
    int func(vector<int>& nums,int l,int r)
    {
        int k = rand();
        // 保证选数在[l,r]之间 
        return nums[k % (r - l + 1) + l];
    }
    void qsort(vector<int>& nums,int l,int r)
    {
        // 有空数组和1个数的数组的情况
        if(l >= r)
        return;
        
        // 选数
        int key = func(nums,l,r);
        int i = l,left = l-1,right = r + 1;  
        // 排序
        while(i < right)
        {
            if(nums[i] < key) swap(nums[++left],nums[i++]);
            else if(nums[i] == key) i++;
            else swap(nums[--right],nums[i]);
        }

        // 递归
        // [l,left] [left + 1,right - 1] [right,r]
        qsort(nums,l,left);
        qsort(nums,right,r);
    }

    vector<int> sortArray(vector<int>& nums) 
    {
        srand(time(NULL));// 设置随机数的种子
        // 数组分成三份  优化随机选数
        qsort(nums,0,nums.size()-1);
        return nums;
    }
};

数组中第K个最大元素

题目解析

在这里插入图片描述

算法原理

在这里插入图片描述

代码

class Solution 
{
public:
    // 把数组分成三份
    int Selectnums(vector<int>& nums,int left,int right)
    {
        // 随机选数
        int r = rand();
        return nums[r % (right - left + 1) + left];
    }
    int qsort(vector<int>& nums,int left,int right,int k)
    {
        //返回条件
        // 只有一个元素
        // 没有空数组的情况因为要找第K大的数,至少要有一个数,有一个数的数组
        if(left == right)
        return nums[left];

        int key = Selectnums(nums,left,right);
        int i = left,l = left - 1,r = right + 1;
        while(i < r)
        {
            if(key == nums[i]) i++;
            else if(key > nums[i]) swap(nums[++l],nums[i++]);
            else swap(nums[--r],nums[i]);
        }

        // 递归
        // [left,l] [l+1,r-1] [r,right]
        // [0,l++]            [r--,n-1]
        int a = l - left + 1;
        int b = r - l - 1;
        int c = right - r + 1;
        if(c >= k)
        return qsort(nums,r,right,k);
        else if((b+c) >= k)
        return key;
        else
        return qsort(nums,left,l,k - b - c);
    }
    int findKthLargest(vector<int>& nums, int k) 
    {
       // 随机选数
       srand(time(NULL));
       int n = nums.size();
       
       return qsort(nums,0,n-1,k);
    }
};

LCR 159. 库存管理 III

题目解析

在这里插入图片描述

算法原理

在这里插入图片描述

代码

class Solution 
{
public:
    // 随机选数
    int GetRound(vector<int>& nums,int left,int right,int k)
    {
        int r = rand();
        return nums[r % (right - left + 1) + left];
    }
    vector<int> inventoryManagement(vector<int>& stock, int cnt) 
    {
        srand(time(NULL));
        qsort(stock,0,stock.size()-1,cnt);
        return {stock.begin(),stock.begin()+cnt};
        // int n = stock.size();
        // sort(stock.begin(),stock.end());
        // vector<int> ret;
        // int i = 0;
        // while(cnt--)
        // {
        //     ret.push_back(stock[i++]);
        // }
        // return ret;
    }
    void qsort(vector<int>& nums,int l,int r,int k)
    {
        if(l >= r) return;

        int key = GetRound(nums,l,r,k);
        int i = l,left = l - 1,right = r + 1;
        while(i < right)
        {
            if(key > nums[i]) swap(nums[++left],nums[i++]);
            else if(key == nums[i]) i++;
            else swap(nums[--right],nums[i]);
        }

        // [l,left] [left + 1,right - 1] [right,r]
        int a = left - l + 1,b = right - left - 1,c = r - right + 1;
        if(a > k) qsort(nums,l,left,k);
        else if(a + b >= k) return;
        else qsort(nums,right,r,k - a - b);
    }
};
举报

相关推荐

0 条评论