当前位置: 首页 > java >正文

【优选算法】分治

一:颜色分类

class Solution {
public:void sortColors(vector<int>& nums) {// 三指针法int n = nums.size();int left = -1, right = n, i = 0;while(i < right){if(nums[i] == 0) swap(nums[++left], nums[i++]);else if(nums[i] == 2) swap(nums[--right], nums[i]);else i++;}}
};

二:排序数组

class Solution {
public:vector<int> sortArray(vector<int>& nums) {srand(time(nullptr));qsort(nums, 0, nums.size()-1);return nums;}void qsort(vector<int>& nums, int left, int right){// 快速排序——三区间[<key][=key][>key]if(left >= right) return;// 选择随机数 Keyint key = GetRand(nums, left, right);// 三指针排法int i = left, l = left-1, r = right+1;while(i < r){if(nums[i] < key) swap(nums[++l], nums[i++]);else if(nums[i] > key) swap(nums[--r], nums[i]);else i++;} // // 开始往下快排// [left, l][l+1, r-1][r, right]qsort(nums, left, l);qsort(nums, r, right);}int GetRand(vector<int>& nums, int left, int right){int r = rand();return nums[r%(right-left+1)+left];}
};

三:数组中的第K个最大元素

 

class Solution {int GetRand(vector<int>& nums, int left, int right){int r = rand();return nums[r%(right-left+1) + left];        }void quickSort(vector<int>& nums, int left, int right){if(left > right)return;// 随机数选keyint key = GetRand(nums, left, right);// 三指针操作法// [<key][=key][>key]int l = left-1, i = left, r = right+1;while(i < r){if(nums[i] < key)swap(nums[++l], nums[i++]);else if(nums[i] > key)swap(nums[--r], nums[i]);elsei++;}// [left, l][l+1, r-1][r, right]quickSort(nums, left, l);quickSort(nums, r, right);}
public:int findKthLargest(vector<int>& nums, int k) {srand(time(0));quickSort(nums, 0, nums.size()-1);return nums[nums.size() - k];}
};

四:库存管理III

class Solution {
private:int GetRand(vector<int>& nums, int left, int right){int r = rand();return nums[r%(right-left+1) + left];}void quickSort(vector<int>& nums, int left, int right){if(left > right)return;// 获取随机数int key = GetRand(nums, left, right);// 三指针法int i = left, l = left-1, r = right+1;while(i < r){if(nums[i] > key)swap(nums[--r], nums[i]);else if(nums[i] < key)swap(nums[++l], nums[i++]);elsei++;}// []][][]quickSort(nums, left, l);quickSort(nums, r, right);}
public:vector<int> inventoryManagement(vector<int>& stock, int cnt) {srand(time(0));quickSort(stock, 0, stock.size()-1);vector<int> ret(stock.begin(), stock.begin() + cnt);return ret;}
};

五:交易逆序对的总数

 

class Solution {int tmp[50010];
private:int mergeSort(vector<int>& nums, int left, int right){if(left >= right)return 0;// 找中间点int mid = (left+right)>>1;int ret = 0;    // 要返回的结果// [left, mid][mid+1, right]// 2. 左边的个数 + 排序 +  右边的个数 + 排序ret += mergeSort(nums, left, mid);ret += mergeSort(nums, mid + 1, right);// 3. 一左一右的个数int cur1 = left, cur2 = mid + 1, i = 0;while(cur1 <= mid && cur2 <= right){if(nums[cur1] <= nums[cur2])tmp[i++] = nums[cur1++];else{ret += (mid - cur1 + 1);tmp[i++] = nums[cur2++];}}// 4. 处理一下排序while(cur1 <= mid) tmp[i++] = nums[cur1++];while(cur2 <= right) tmp[i++] = nums[cur2++];for(int i = left; i <= right; i++)nums[i] = tmp[i-left];return ret;}
public:int reversePairs(vector<int>& record) {return mergeSort(record, 0, record.size()-1);}
};

六:计算右侧小于当前元素的个数

 

class Solution {vector<int> ret;vector<int> index;  // 记录 nums 下当前元素的原始下标int tmpNums[50010];int tmpIndex[50010];    
private:void mergeSort(vector<int>& nums, int left, int right){if(left >= right)return ;int mid = (left + right) >> 1;// [left, mid][mid+1, right]// 1. 先处理 左右两部分mergeSort(nums, left, mid);mergeSort(nums, mid + 1, right);// 2. 处理一左一右的情况int cur1 = left, cur2 = mid + 1, i = 0;while(cur1 <= mid && cur2 <= right){if(nums[cur1] <= nums[cur2]){tmpNums[i] = nums[cur2];tmpIndex[i++] = index[cur2++];}else{ret[index[cur1]] = right-cur2 + 1;tmpNums[i] = nums[cur1];tmpIndex[i++] = index[cur1++];}}// 3. 处理剩下的排序while(cur1 <= mid){tmpNums[i] = nums[cur1];tmpIndex[i++] = index[cur1++];}while(cur2 <= right){tmpNums[i] = nums[cur2++];tmpIndex[i++] = index[cur2++];}for(int i = left; i <= right; i++){nums[i] = tmpNums[i-left];index[i] = tmpIndex[i-left];}}
public:vector<int> countSmaller(vector<int>& nums) {int n = nums.size();ret.resize(n);// 初始化 index 按钮for(int i = 0; i < n; i++){index[i] = i;}mergeSort(nums, 0, n-1);return ret;}
};

七:翻转对

 

class Solution {int tmp[50010];int mergeSort(vector<int>& nums, int left, int right){if(left >= right)return 0;//1int mid = (left + right)>>1;// [left, mid][mid+1, right]int ret = 0;ret += mergeSort(nums, left, mid);ret += mergeSort(nums, mid + 1, right);// 2. int cur1 = left, cur2 = mid +1, i = left;while(cur1 <= mid)  // 降序的情况{while(cur2 <= right && nums[cur2] >= nums[cur1]/2.0)cur2++;if(cur2 > right)break;ret += right - cur2 + 1;cur1++;}// 4. cur1 = left, cur2 = mid+1;while(cur1 <= mid && cur2 <= right)tmp[i++] = nums[cur1]<nums[cur2]? nums[cur2++] : nums[cur1++];while(cur1 <= mid)tmp[i++] = nums[cur1++];while(cur2 <= right)tmp[i++] = nums[cur2++];// 5for(int i = left; i <= right; i++)nums[i] = tmp[i];// 6return ret;}
public:int reversePairs(vector<int>& nums) {return mergeSort(nums, 0, nums.size()-1);}
};
http://www.xdnf.cn/news/12831.html

相关文章:

  • Java线程池
  • nginx配置文件
  • leetcode238-除自身以外数组的乘积
  • 【JVM面试篇】高频八股汇总——Java内存区域
  • 华为OD机考 - 水仙花数 Ⅰ(2025B卷 100分)
  • 8. 二叉树(随想录)
  • 本地缓存在Java中的实现方式
  • “图像说话,文本有图”——用Python玩转跨模态数据关联分析
  • 【2025CVPR】模型融合新范式:PLeaS算法详解(基于排列与最小二乘的模型合并技术)
  • 飞云控盘指标-副图指标-买点一持仓操作技术图文解说
  • 初级程序员入门指南
  • 跟进一下目前最新的大数据技术
  • 设备驱动与文件系统:06 目录与文件
  • 骨盆-x光参数
  • python生成器
  • SWAN(Scade One) 语言原理介绍
  • Linux中《进程控制》详细介绍
  • RootSIFT的目标定位,opencvsharp。
  • DOM(文档对象模型)深度解析
  • 开源项目实战学习之YOLO11:12.6 ultralytics-models-tiny_encoder.py
  • 【深度学习-Day 25】告别过拟合:深入解析 L1 与 L2 正则化(权重衰减)的原理与实战
  • 标准代码项目开发流程学习指南
  • CMS内容管理系统的设计与实现:架构设计
  • 红黑树完全指南:为何工程都用它?原理、实现、场景、误区全解析
  • 数学:”度量空间”了解一下?
  • JESD204B IP核接口实例,ADI的ADRV9009板卡,ZYNQ7045驱动实现2发2收。
  • LLMs 系列科普文(14)
  • 关于IE浏览器被绑定安装,还卸载不掉
  • 72常用控件_QGridLayout的使用
  • 热成像实例分割电力设备数据集(3类,838张)