• 每日一记--2014.9.15


    今天的程序还有待改进,写的可能比较冗长了,虽然逻辑不难,自己也是debug了一会儿。

    问题是:找数值中的主元素,即个数超过半数的元素。

    首先找出唯一的一个候选元素,然后再遍历数值统计其个数,看是否大于数组长度的二分之一,如大于则返回此主元素,若小于则表明没有主元素那么返回-1(假设数组中的数均为正整数)。

    如何寻找唯一的候选元素:

          1.利用递归

          2.为找出A中的候选元,先构造B。逐次比较A中的两个元素:比较A1和A2,若相等,则放入B;否则什么也不做。然后比较A3和A4,若相等,则放入B;否则什么也不做。依次方式继续直到读完整个A(当A中有奇数个元素时,则将最后一个元素直接放入B中)然后寻找B中的候选元素。一直递归下去,直到B中只剩一个候选元素为止,或者B中元素为0个,则证明没有主元素。

          

     1 package mainElement;
     2 
     3 public class MainElement {
     4 
     5     public static void main(String[] args) {
     6         // TODO Auto-generated method stub
     7         int[] aa = new int[] {5,2,3,5,5,5,1,7,5,9,5};
     8         System.out.println(findMain(aa,aa.length));
     9     }
    10 
    11     private static int findMain(int[] aa, int length) {
    12         int mainEle = findMainCandi(aa,length);
    13         if(mainEle!=-1){
    14             int count=0;
    15             for(int i=0;i<length;i++){
    16                 if(aa[i]==mainEle)
    17                     count++;
    18             }
    19             if(count>(length/2)){
    20                 return mainEle;
    21             }else{
    22                 return -1;
    23             }
    24             
    25         }else{
    26             return -1;
    27         }
    28         
    29     }
    30 
    31     // 如果有候选主元素就返回此候选,如没有返回-1
    32     
    33     private static int findMainCandi(int[] aa,int len) {
    34         // TODO Auto-generated method stub
    35        if (len == 1) {
    36             return aa[0];
    37         } else {
    38             int length =0;
    39             int[] bb = new int[len];
    40             if (len % 2 == 0) {
    41                 int j=0;
    42                 for (int i = 0; i < len; i = i + 2) {
    43                     if (aa[i] == aa[i + 1])
    44                         bb[j++] = aa[i];
    45                 }
    46                 if(j==0)
    47                     return -1;
    48                 else
    49                     length=j;
    50             } else {
    51                 int j=0;
    52                 for (int i = 0; i < len - 1; i = i + 2) {
    53                     if (aa[i] == aa[i + 1])
    54                         bb[j++] = aa[i];
    55                 }
    56                 bb[j] = aa[len - 1];
    57                 length=j+1;
    58             }
    59             return findMain(bb,length);
    60         }
    61     }
    62 }
  • 相关阅读:
    10.16 NOIP模拟赛
    10.14 牛客提高集训营5
    10.12 正睿普及4
    Codeforces Round #516 (Div. 2) (A~E)
    hihoCoder.1509.异或排序(位运算 思路)
    hihoCoder.1513.小Hi的烦恼(bitset 五维偏序)
    hihoCoder挑战赛19 A.Rikka with Sequence(状压DP)
    BZOJ.3668.[NOI2014]起床困难综合症(贪心)
    BZOJ.4903.[CTSC2017]吉夫特(Lucas DP)
    BZOJ.3329.Xorequ(数位DP)
  • 原文地址:https://www.cnblogs.com/ivywenyuan/p/3973836.html
Copyright © 2020-2023  润新知