整数配列にKの多数を探し

説明タイトル:整数のアレイでは、考え速い行に応じて、Kの多数の配列を見つけます。

アイデア:

  1. 高速放電を用いて考え、例えば、大規模な要素49の最初の24個の要素を探し、
  2. まず、高速行、(大に前半、既知の後半には)、中心軸Pを与えると想定されます
  3. 直接確立された場合、P-低+ 1 == kを解析して(最初の半分は、K-1より大きいので、[P]の要素を有するk番目の最大要素である[P]となるよう)、[P]を出力します。
  4. P-低+ 1> kの場合、高い前半のk番目の最大要素を更新= P-1、2に進み
  5. (P-低+もし<K、今回低= P + 1を更新し、及びk = K-(1 + P =低)の後半におけるk番目の最大要素、複雑さはO 2 [時間に進みますN-)]

コードは示しています。

package com.bittech.Test;

/**
 * package:com.bittech.Test
 * Description:TODO
 * @date:2019/5/26
 * @Author:weiwei
 **/
public class Test0526 {
    public int findKth(int[] a, int n, int k) {
        return findKth(a, 0, n - 1, k);
    }

    public int findKth(int[] a, int low, int high, int k) {
        int part = partation(a, low, high);

        if (k == part - low + 1) {
            return a[part];
        } else if (k > part - low + 1) {
            return findKth(a, part + 1, high, k - part + low - 1);
        } else {
            return findKth(a, low, part - 1, k);
        }
    }

    public int partation(int[] a, int low, int high) {
        int key = a[low];
        while (low < high) {
            while (low < high && a[high] <= key) {
                high--;
                a[low] = a[high];
            }
            while (low < high && a[low] >= key) {
                low++;
                a[high] = a[low];
            }
            a[low] = key;
            return low;
        }
        return low;
    }
}

 

おすすめ

転載: blog.csdn.net/weixin_43224539/article/details/90579859