美文网首页
查找算法之数组中超过一半的数字

查找算法之数组中超过一半的数字

作者: 旭仔_2e16 | 来源:发表于2018-10-08 21:34 被阅读0次

题目:一个无序数组中有一个数出现的次数超过数组长度的一半,找出该值。如{1,2,3,2,4,2,5,2},值为2。
思想:如果数组是有序的,那么出现次数超过一半的值一定是它的中位数,因此一种方法就是全排序,然后中间的那个数就是要找的值。
还有一种方法就是将上述问题转化为找中位数的问题。这时候就可以用快排的思想了,不断的左右排序,直到找到基准值所在的位置是n/2,这时候左右达到平衡。如果基准值小于n/2,那么中位数一定在右边,于是继续从右边找,如果大于n/2,那么中位数一定在左边,那么就在左边找,如此递归,直到找到为止。总的思想还是快排。

public int findUsingQuickSort(int[] arr, int start, int end){
  int low = start;
  int high = end;
  int key = arr[start];
  while(low < hight){
    while(low<high && arr[high]>key){
        high--;
    }
  arr[low]=arr[high];
  while(low<high && arr[low]<key){
        low++;
    }
  arr[high]=arr[low];
  }
  arr[low] = key;  
  if(low==(arr.length-1)/2){
    return arr[(arr.lenght-1)/2]
   }else if(low<(arr.length-1)/2)
    return findUsingQuickSort(arr, low+1, end);
  }else if(low > (arr.lenght-1)/2){
    return findUsingQuickSort(arr, start, low-1);
  }
return -1;
}

相关文章

网友评论

      本文标题:查找算法之数组中超过一半的数字

      本文链接:https://www.haomeiwen.com/subject/ywqsaftx.html