美文网首页
每天一道算法题16

每天一道算法题16

作者: 雨打空城 | 来源:发表于2022-01-24 16:41 被阅读0次

长度为N的数组arr,一定可以组成N^2个数值对,
例如arr=[3,1,2];
数值对有(3,3),(3,1),(3,2),(1,3),(1,1),(1,2),(2,3),(2,1),(2,2);
也就是任意两个数都有数值对,而且自己和自己也算数值对,数值对怎么排序,规定,第一维数据从小到大,
第二维数据一样的,第二维数组也从小到大。给定一个数组arr,和整数K,返回第k小的数值对。

假设n个数有序,想找第k小的数值对,

  1. 第一个数的下标为(k-1)/n ,对应值为f
  2. 遍历数组小于f有a个,等于f 有b个
  3. (k - a * n) = s, 代表在第一个数为f的情况下,找第s小。
  4. 第二个数下标为(s-1)/b;
public static int[] kthMinPair(int[] arr, int k) {
        int N = arr.length;
        if (k > N * N) {
            return null;
        }
        Arrays.sort(arr);   
        int fristNum = arr[(k - 1) / N];
        int lessFristNumSize = 0;
        int fristNumSize = 0; 
        for (int i = 0; i < N && arr[i] <= fristNum; i++) {
            if (arr[i] < fristNum) {
                lessFristNumSize++;
            } else {
                fristNumSize++;
            }
        }
        int rest = k - (lessFristNumSize * N);
        return new int[] { fristNum, arr[(rest - 1) / fristNumSize] };
    }

相关文章

网友评论

      本文标题:每天一道算法题16

      本文链接:https://www.haomeiwen.com/subject/cjnmhrtx.html