• Expm 2_2 查找中项问题


    对于长度为n的整型数组A,随机生成其数组元素值,然后实现一个线性时间的算法,在该数组中查找其中项。

     1 package org.xiu68.exp.exp3;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 import java.util.Random;
     6 
     7 public class Exp3_1 {
     8 
     9     //对于长度为n的整型数组A,随机生成其数组元素值,然后实现一个线性时间的算法,在该数组中查找其中项
    10     public static void main(String[] args) {
    11         // TODO Auto-generated method stub
    12         ArrayList<Integer> array=new ArrayList<>();
    13         for(int j=0;j<10;j++){
    14             array.clear();
    15             for(int i=0;i<10;i++){
    16                 int k=new Random().nextInt(100);
    17                 array.add(k);
    18                 System.out.print(k+"  ");
    19             }
    20             System.out.println();
    21             System.out.println("中位数为"+findMedian(array,array.size()/2));
    22         }
    23     }
    24     
    25     //获取中位数
    26     public static int findMedian(List<Integer> array,int k){
    27         
    28         int v=array.get(0);
    29         ArrayList<Integer> leftList=new ArrayList<>();        //比v小的集合
    30         ArrayList<Integer> equalList=new ArrayList<>();        //与v相等的集合
    31         ArrayList<Integer> rightList=new ArrayList<>();        //比v大的集合
    32         
    33         for(int i=0;i<array.size();i++){
    34             int value=array.get(i);
    35             if(value>v){
    36                 rightList.add(value);
    37             }else if(value<v){
    38                 leftList.add(value);
    39             }else{
    40                 equalList.add(value);
    41             }
    42         }
    43         //findMedian(S,k)=findMedian(SL,k)  如果k<=|SL|
    44         if(k<=leftList.size())
    45             return findMedian(leftList,k);
    46         //findMedian(S,k)=v  如果|SL|<k<=|SL|+|SV|
    47         else if(k>leftList.size() && k<=leftList.size()+equalList.size())
    48             return equalList.get(0);
    49         //findMedian(S,k)=findMedian(SR,k-|SL|-|SV|)  如果k>|SL|+|SV|
    50         else
    51             return findMedian(rightList,k-leftList.size()-equalList.size());
    52     }
    53 
    54 }
    View Code
  • 相关阅读:
    OpenJudge 6042 雇佣兵
    POJ 1741 树上 点的 分治
    Codevs 1695 Windows2013
    复制书稿
    乘积最大
    编辑距离问题
    石子合并
    最大正方形子矩阵
    选菜
    混合背包
  • 原文地址:https://www.cnblogs.com/xiu68/p/7988630.html
Copyright © 2020-2023  润新知