2022-3-11 剑指offer day29

题1:

JZ40 最小的K个数

描述

给定一个长度为 n 的可能有重复值的数组,找出其中不去重的最小的 k 个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4(任意顺序皆可)。
数据范围:0\le k,n \le 100000k,n10000,数组中每个数的大小0 \le val \le 10000val1000
要求:空间复杂度 O(n)O(n) ,时间复杂度 O(nlogn)O(nlogn)
 
 1 import java.util.*;
 2 
 3 public class Solution {
 4     public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
 5         PriorityQueue<Integer> queue=new PriorityQueue<>((a,b)->b-a);
 6         for (int x:input) {
 7             if (queue.size()<k) {
 8                 queue.offer(x);
 9                 continue;
10             }else {
11                 if (!queue.isEmpty()&&x<=queue.peek()) {
12                     queue.poll();
13                     queue.offer(x);
14                 }
15             }
16         }
17         ArrayList<Integer> list=new ArrayList<>();
18         while (!queue.isEmpty()) {
19             list.add(queue.poll());
20         }
21         return list;
22     }
23 }

思路:size为 k的大根堆。

 

题2:

JZ41 数据流中的中位数

 

描述

如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。
 
数据范围:数据流中数个数满足 1 \le n \le 1000 \1n1000  ,大小满足 1 \le val \le 1000 \1val1000 

进阶: 空间复杂度 O(n) \O(n)  , 时间复杂度 O(nlogn) \O(nlogn) 
 
 1 import java.util.*;
 2 public class Solution {
 3     
 4     
 5     int size=0;
 6     int[] arr=new int[1001];
 7     public void Insert(Integer num) {
 8         if (size==0) arr[0]=num;
 9         else {
10             int l=0,r=size;
11             while (l<r){
12                 int mid=(l+r)/2;
13                 if (num>arr[mid]){
14                     l=mid+1;
15                 }else r=mid;
16             }
17             int index=l;
18             for (int i=size;i>=index+1;i--) {
19                 arr[i]=arr[i-1];
20             }
21             arr[index]=num;
22         }
23         size++;
24     }
25 
26     public Double GetMedian() {
27         if (size%2==0) {
28             return (double)(arr[size/2]+arr[size/2-1])/2;
29         }else {
30             return (double)arr[(size-1)/2];
31         }
32     }
33 
34 
35 }

思路:维护插入一个有序数组,中位数直接判断奇偶计算即可。

posted on 2022-03-11 10:15  阿ming  阅读(59)  评论(0)    收藏  举报

导航