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 100000≤k,n≤10000,数组中每个数的大小0 \le val \le 10000≤val≤1000
要求:空间复杂度 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 \1≤n≤1000 ,大小满足 1 \le val \le 1000 \1≤val≤1000
进阶: 空间复杂度 O(n) \O(n) , 时间复杂度 O(nlogn) \O(nlogn)
进阶: 空间复杂度 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 }
思路:维护插入一个有序数组,中位数直接判断奇偶计算即可。
浙公网安备 33010602011771号