package com.model.array; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; /** * @Description:测试类 * @Author: 张紫韩 * @Crete 2021/9/2 23:23 * 给你一个数组arr * 再给你一个[0,3,2] 查询数组arr从0到3有几个2 * 给你一个:[[0,3,2],[0,4,2],[1,3,2]] * 输出结果 */ public class ArrayDemo09 { public static void main(String[] args) { int[] arr={1,1,2,3,4,5,1,6}; int[][] matrix={{0,3,1},{0,6,1}}; System.out.println(Arrays.toString(getArr(arr, matrix))); } // 的到最终结果 public static int[] getArr(int[] arr,int[][] matrix){ // 得到数组中各个数在数组中的所有的下标,获取这张表 HashMap<Integer, ArrayList<Integer>> table = getTable(arr); int[] resInt = new int[matrix.length]; int index=0; for (int[] temp:matrix){ int left=temp[0]; int right=temp[1]; int target=temp[2]; resInt[index++]=getCount(table, target, left, right); } return resInt; } // 返回每个数和他的对用的出现下标的一张表 public static HashMap<Integer,ArrayList<Integer>> getTable(int[] arr){ HashMap<Integer, ArrayList<Integer>> map = new HashMap<>(); for (int i = 0; i < arr.length; i++) { ArrayList<Integer> list; if (!map.containsKey(arr[i])){ list = new ArrayList<>(); }else { list = map.get(arr[i]); } list.add(i); map.put(arr[i],list); } // for (Integer key:map.keySet()){ // System.out.println(key+"\t"+map.get(key)); // } return map; } //返回在right和left之间有几个数 public static int getCount(HashMap<Integer,ArrayList<Integer>> table,int target,int left,int right){ ArrayList<Integer> list = table.get(target); return small(list,right+1)-small(list,left); } // 返回list中小于index的有几个 public static int small(ArrayList<Integer> list,int index){ int l=0; int r=list.size()-1; int res=-1; while (l<=r){ int mid=l+(r-l)/2; if (list.get(mid)<index){ res=mid; l=mid+1; } else { r=mid-1; } } return res+1; } }