每天一道算法题16

长度为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] };
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 算法这个活动很严,每天必须打卡,而且不限制语言,群内已有PHP、Python、Java、Javascript...
    鸡汤小弟阅读 2,860评论 5 4
  • 【分治法 a + c != 2*b】给定一个正整数M,请构造出一个长度为M的数组arr,要求对任意的i,j,k三个...
    雨打空城阅读 1,365评论 0 0
  • 如果每天做一道算法题,那是不是每天都在进步? 前言 这个活动是从2019年7月中旬开始的,人数不算多,也就几个好友...
    鸡汤小弟阅读 2,571评论 0 2
  • 【窗口移动】给定一个有序数组arr, 从左到右依次表示X轴上从左往右点的位置,给定一个正整数L,返回如果有一根长度...
    雨打空城阅读 1,534评论 0 0
  • 【装水】给定一个数组arr, 已知其中所有的值都是非负的,将这个数组看作一个容器,请返回容器能装多少水?比如:ar...
    雨打空城阅读 1,930评论 0 0