leetcode786. 第 K 个最小的素数分数


力扣链接

题目描述

给你一个按递增顺序排序的数组 arr 和一个整数 k 。数组 arr1 和若干 素数 组成,且其中所有整数互不相同。

对于每对满足 0 < i < j < arr.lengthij ,可以得到分数 arr[i] / arr[j]

那么第 k 个最小的分数是多少呢? 以长度为 2 的整数数组返回你的答案, 这里 answer[0] == arr[i]answer[1] == arr[j]

示例 1:

输入:arr = [1,2,3,5], k = 3
输出:[2,5]
解释:已构造好的分数,排序后如下所示: 
1/5, 1/3, 2/5, 1/2, 3/5, 2/3
很明显第三个最小的分数是 2/5

示例 2:

输入:arr = [1,7], k = 1
输出:[1,7]

提示:

  • 2 <= arr.length <= 1000
  • 1 <= arr[i] <= 3 * 104
  • arr[0] == 1
  • arr[i] 是一个 素数i > 0
  • arr 中的所有数字 互不相同 ,且按 严格递增 排序
  • 1 <= k <= arr.length * (arr.length - 1) / 2

解题思路

  • 自定义排序

代码(自定义排序)

	public int[] kthSmallestPrimeFraction(int[] arr, int k) {
    
    
        List<int[]> list = new ArrayList<>();
        int len = arr.length;
        for (int i = 0; i < len; i++) {
    
    
            for (int j = i + 1; j < len; j++) {
    
    
                list.add(new int[]{
    
    arr[i], arr[j]});
            }
        }

        Collections.sort(list, (x, y) -> x[0] * y[1] - x[1] * y[0]);
        return list.get(k - 1);
    }

复杂度

  • 时间复杂度:O(n^2logn),其中 n 是数组 arr 的长度。素数分数一共有 n(n-1)/2 = O(n^2) ,因此排序需要的时间为O(n^2logn)。
  • 空间复杂度:O(n^2),即为存储所有素数分数需要的空间。

代码(优先队列)

class Solution {
    
    
    public int[] kthSmallestPrimeFraction(int[] arr, int k) {
    
    
        PriorityQueue<int[]> queue = new PriorityQueue<>((x, y) -> arr[x[0]] * arr[y[1]] - arr[x[1]] * arr[y[0]]);
        int len = arr.length;
        //录入len-1个最小的素数分数
        for (int i = 1; i < len; i++) {
    
    
            queue.offer(new int[]{
    
    0, i});
        }
        //移除k-1个最小的素数分数
        for (int i = 1; i < k; i++) {
    
    
            int[] poll = queue.poll();
            int a = poll[0];
            int b = poll[1];

            if (a + 1 < b) {
    
    
                queue.offer(new int[]{
    
    a + 1, b});
            }
        }
        return new int[]{
    
    arr[queue.peek()[0]], arr[queue.peek()[1]]};
    }

}

复杂度

  • 时间复杂度:O(klogn),其中 n 是数组 arr 的长度。优先队列的单次操作时间复杂度为 O(logn),一共需要进行 O(k) 次操作。
  • 空间复杂度:O(n),即为优先队列需要使用的空间。

Guess you like

Origin blog.csdn.net/qq_43478625/article/details/121622531