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

【算法】分治

1. 快速排序

912. 排序数组 - 力扣(LeetCode)

        

         

    private void quickSort(int[] nums, int head, int tail) {// 递归出口if (head >= tail) {return;}// 数组分块的逻辑int key = nums[new Random().nextInt(tail - head + 1) + head];int left = head - 1, right = tail + 1, scan = head;while (scan < right) {if (nums[scan] < key) {left++;swap(nums, scan, left);scan++;} else if (nums[scan] > key) {right--;swap(nums, scan, right);} else {scan++;}}// 递归调用quickSort(nums, head, left);quickSort(nums, right, tail);}

75. 颜色分类 - 力扣(LeetCode)

        

        int len = nums.length, scan = 0, left = -1, right = len;while (scan < right) {if (nums[scan] == 0) {left++; swap(nums, scan, left);scan++;          } else if (nums[scan] == 2) {right--;swap(nums, scan, right);} else {scan++;}}

2. 快速选择

面试题 17.14. 最小K个数 - 力扣(LeetCode)

                

        // 在快排的基础上,改变递归条件即可if (left - head + 1 >= k) {quickSort(nums, k, head, left);} else if (right - head + 1 <= k) {quickSort(nums, k - (right - head), right, tail);} else {return;}

3. 归并排序

912. 排序数组 - 力扣(LeetCode)

        归并排序的思想类似快速排序,快速排序是先将数组大致排序,再递归,类似二叉树的前序遍历,归并排序是先递归,递归到最后再排序,层层返回排好序的结果,类似二叉树的后序遍历。

        

    private void mergeSort(int[] nums, int left, int right) {// 出口if (left >= right) {return;}// 递归调用int mid = (right + left) / 2;mergeSort(nums, left, mid);mergeSort(nums, mid + 1, right);// 为两个有序数组排序int s1 = left, e1 = mid, s2 = mid + 1, e2 = right;int i = 0;while (s1 <= e1 && s2 <= e2) {tempArr[i++] = nums[s1] < nums[s2] ? nums[s1++] : nums[s2++]; }while (s1 <= e1) {tempArr[i++] = nums[s1++];}while (s2 <= e2) {tempArr[i++] = nums[s2++];}        // 将合并后的结果写回原数组for (int j = left; j <= right; j++) {nums[j] = tempArr[j - left];}        }

LCR 170. 交易逆序对的总数 - 力扣(LeetCode)

        

                

                

    private void mergeSort(int[] record, int left, int right) {if (left >= right) {return;}int mid = (left + right) / 2;mergeSort(record, left, mid);mergeSort(record, mid + 1, right);int s1 = left, e1 = mid, s2 = mid + 1, e2 = right;int i = 0;while (s1 <= e1 && s2 <= e2) {if (record[s1] <= record[s2]) {tempArr[i++] = record[s1++];} else {count += e1 - s1 + 1;tempArr[i++] = record[s2++];}}while (s1 <= e1) {tempArr[i++] = record[s1++];}while (s2 <= e2) {tempArr[i++] = record[s2++];}for (int j = left; j <= right; j++) {record[j] = tempArr[j - left];}      }

 315. 计算右侧小于当前元素的个数 - 力扣(LeetCode)

        这道题和上一道题类似,但是更麻烦一些。这道题相当于要我们分别记录每一个数所能形成的逆序对的数量,这需要角标能够对应得上。

        

        但是归并排序时,每层调用栈拿到的数组都是改变过位置的,这就需要我们手动记录角标的变化。只要我们始终明确,要统计的那个数最初所在的下标,就可以做到对号入座,分别记录了。

        

    private void mergeSort(int[] nums, int left, int right) {if (left >= right) {return;}int mid = (left + right) / 2;mergeSort(nums, left, mid);mergeSort(nums, mid + 1, right);int s1 = left, e1 = mid, s2 = mid + 1, e2 = right;int i = 0;while (s1 <= e1 && s2 <= e2) {if (nums[s1] <= nums[s2]) {tempIndex[i] = index[s2];tempNums[i++] = nums[s2++];} else {ret[index[s1]] += e2 - s2 + 1;tempIndex[i] = index[s1];tempNums[i++] = nums[s1++];}}while (s1 <= e1) {tempIndex[i] = index[s1];tempNums[i++] = nums[s1++];}while (s2 <= e2) {tempIndex[i] = index[s2];tempNums[i++] = nums[s2++];}for (int j = left; j <= right; j++) {index[j] = tempIndex[j - left];nums[j] = tempNums[j - left];}}

493. 翻转对 - 力扣(LeetCode)

        这道题类似于交易的逆序对那道题,唯一的区别就是,这道题的命中条件是 nums[i] > 2 * nums[j],不再是 nums[i] > nums[j] 了。所以不能和归并排序的逻辑写到一起去,必须分开写。

http://www.dtcms.com/a/295559.html

相关文章:

  • Ubuntu 20.04 上安装 SPDK
  • RP2040关键汇编函数解释
  • 旧物回收小程序系统开发——开启绿色生活新篇章
  • 基于区块链的商品销售系统(fiscobcos)
  • 本地部署dify1.7.0流程-windows docker
  • [AI 生成] Flink 面试题
  • 企业ERP系统全模块深度解析:从基础管理到智能运营
  • 算法提升之字符串(字典树)
  • 【C++】标准模板库(STL)—— 学习算法的利器
  • 【Qt开发】信号与槽(一)
  • 【MediaTek】AN7563编译wlan_hwifi出现en_npu.c:42:10: fatal error:
  • 上课啦 | 7月27日 Oracle OCP 19C(直播/面授 )
  • docker pull weaviate 国内拉取失败的问题
  • 面试题(技术面+hr面)
  • odoo欧度软件小程序——删除用户
  • 【Lucene】文件概览
  • 【Java学习|黑马笔记|Day21】IO流综合练习,多线程|常用成员方法,守护线程、礼让线程、插入线程
  • 借助 Amazon Redshift 为具有强大抗风险能力的使用案例提供支持
  • AI结对编程:分布式团队的集体记忆外脑
  • Leetcode力扣解题记录--第2题(加法模拟)
  • (进阶向)Python第十四期OpenCv图像预处理方法[2]
  • ModernBERT如何突破BERT局限?情感分析全流程解析
  • 输电线路微气象在线监测装置:保障电网安全的科技屏障
  • Text2SQL智能问答系统开发(一)
  • 成品电池综合测试仪:保障电池品质与安全的核心工具|深圳鑫达能
  • C++抽象类完全指南
  • 三坐标测量仪高效批量检测轴类传动零件
  • 基于深度学习的图像分类:使用EfficientNet实现高效分类
  • 基础NLP | 常用工具
  • DeepSpeed-FastGen:通过 MII 和 DeepSpeed-Inference 实现大语言模型的高吞吐文本生成