分治算法--最大值最小值、最大值次大值问题

雨点打透心脏的1/2处 2024-04-23 20:14 164阅读 0赞

最大值最小值问题

  1. // 分治法求解最大值和最小值问题
  2. void MaxMin(int a[], int low, int high, int &Max, int &Min) {
  3. if(low == high) {
  4. // 只有一个元素
  5. Max = a[low];
  6. Min = INF;
  7. } else if(low == high-1) {
  8. // 只有两个元素
  9. Max = max(a[low], a[high]);
  10. Min = min(a[low], a[high]);
  11. } else {
  12. int mid = (low + high)/2; // 分为两半
  13. int lmax, lmin; // 左半边第一大、第二大
  14. MaxMin(a, low, mid, lmax, lmin);
  15. int rmax, rmin; // 右半边第一大、第二大
  16. MaxMin(a, mid+1, high, rmax, rmin);
  17. // 左半边、右半边再进行比较
  18. Max = max(lmax, rmax);
  19. Min = min(lmin, rmin);
  20. }
  21. }

最大值、次大值问题

  1. // 用分治法查找序列中的最大值和次大值
  2. void max1max2(int a[], int low, int high, int &max1, int &max2) {
  3. if(low == high) {
  4. // 只有一个元素
  5. max1 = a[low];
  6. max2 = INF;
  7. } else if(low == high-1) {
  8. // 只有两个元素
  9. max1 = max(a[low], a[high]);
  10. max2 = min(a[low], a[high]);
  11. } else {
  12. int mid = (low + high)/2; // 分为两半
  13. int lmax1, lmax2; // 左半边第一大、第二大
  14. max1max2(a, low, mid, lmax1, lmax2);
  15. int rmax1, rmax2; // 右半边第一大、第二大
  16. max1max2(a, mid+1, high, rmax1, rmax2);
  17. // 左半边、右半边再进行比较
  18. if(lmax1 > rmax1) {
  19. max1 = lmax1;
  20. max2 = max(lmax2, rmax1);
  21. } else {
  22. max1 = rmax1;
  23. max2 = max(rmax2, lmax1);
  24. }
  25. }
  26. }

#

发表评论

表情:
评论列表 (有 0 条评论,164人围观)

还没有评论,来说两句吧...

相关阅读

    相关 分治法求

    分治法是一种递归的问题解决方法,它将一个大问题划分为多个小问题,然后逐个解决这些小问题,最后将结果合并得到最终的解决方案。对于求最大最小值的问题,可以使用分治法来解决。 以下

    相关

    最大值 时间限制: 3000 ms 内存限制: 131072 KB 题目描述 Shy 有 n 个发电站。每个发电站有一个 level(可正可负的整数),i 号