算法进阶二

BFPRT算法:
int bfprt(arr,k){ //1.分组 //2.组内排序 //3.中位拿出组成N/5大小的新数组 new_arr[] //4.num = bfprt(new_arr,new_arr.length/2) //5.原数组根据num做划分,小于num的放在左边,等于num的放在中间,大于num的放在右边,最后看是否命中k,命中了直接返回,没有命中,选一侧走}

算法进阶二
文章图片
Image 2.png
算法进阶二
文章图片
Image 3.png
算法进阶二
文章图片
Image 4.png 算法进阶二
文章图片
Image 5.png 算法进阶二
文章图片
Image 6.png
package com.znst; public class Demo {//o(N*longk)用堆做的,不是bfprt算法 public static int[] getMinkNumsByHeap(int[] arr,int k) { if(k<1||k>arr.length) { return arr; } int[] kHeap = new int[k]; for(int i=0; i!=k; i++) { heapInsert(kHeap,arr[i],i); } for(int i=k; i!=arr.length; i++) { if(arr[i]arr.length) { return arr; } int minKth = getMinKthByBFPRT(arr,k); int[] res = new int[k]; int index =0; for(int i =0; i!=arr.length; i++) { if(arr[i]=pivotRange[0]&&i<=pivotRange[1]) { return arr[i]; }else if(ipivotValue) { swap(arr,cur,--big); }else { cur++; } } int[] range =new int[2]; range[0]=small+1; range[1]=big-1; return range; }public static int getMedian(int[] arr,int begin,int end) { insertionSort(arr,begin,end); int sum = end+begin; int mid = (sum/2)+(sum%2); return arr[mid]; }public static void insertionSort(int[] arr,int begin,int end) { for(int i=begin+1; i!=end+1; i++) { for(int j=i; j!=begin; j--) { if(arr[j-1]>arr[j]) { swap(arr,j-1,j); }else { break; } } } }public static void swap(int[] arr,int index1,int index2) {if(arr!=null) { int temp = arr[index1]; arr[index1]=arr[index2]; arr[index2]=temp; } } public static void printArray(int[] arr) { for(int i =0; i!=arr.length; i++) { System.out.println(arr[i]+" "); } System.out.println(); }public static void main(String[] args) { int[] arr = {6,9,1,3,1,2,2,5,6,1,3,5,9,7,2,5,6,1,9}; printArray(getMinkNumsByHeap(arr,10)); printArray(getMinkNumsByBFPRT(arr,10)); } }

介绍窗口以及窗口内最大值或最小值的更新结构(单调双向队列)
算法进阶二
文章图片
Image 8.png
package com.znst; import java.util.LinkedList; public class Demo2 {public static int[] getMaxWindow(int[] arr,int w) { if(arr==null||w<1||arr.length qmax = new LinkedList(); int[] res = new int[arr.length-w+1]; int index =0; for(int i=0; i=w-1) {//收集最大值,返回 res[index++]=arr[qmax.peekFirst()]; } } return res; }}

算法进阶二
文章图片
Image 9.png
package com.znst; import java.util.LinkedList; public class Demo2 {public static int getNum(int[] arr,int num) { if(arr==null||arr.length==0) { return 0; } LinkedList qmin = new LinkedList(); LinkedList qmax = new LinkedList(); int i=0; int j =0; int res=0; while(i=arr[j]) { qmin.pollLast(); } qmin.addLast(j); while(!qmax.isEmpty()&&arr[qmax.peekLast()]<=arr[j]) { qmax.pollLast(); } qmax.addLast(j); if(arr[qmax.getFirst()]-arr[qmin.getFirst()]>num) { break; } j++; } if(qmin.peekFirst()==i) { qmin.pollFirst(); } if(qmax.peekFirst()==L) { qmax.pollFirst(); } res+=j-i; i++; } return res; }}

【算法进阶二】介绍单调栈结构
算法进阶二
文章图片
Image 10.png 算法进阶二
文章图片
Image 11.png 算法进阶二
文章图片
Image 12.png 算法进阶二
文章图片
Image 13.png

    推荐阅读