ソートアルゴリズムケース
数字の半分以上:デジタル配列は、この番号を見つけるために、より多くの配列の長さの半分より登場した回数。
溶液1:リターンNLG、ARR [N / 2]をソート (N)
溶液2統計ハッシュ:
溶液3:配列統計、O(N)、制限:配列の内容変更する必要性
溶液4:異なる数、除去します
コードの実装
package LanQiao;
import java.util.Arrays;
public class Demo08
{
public static void main(String[] args)
{
solve5(new int[]{0,1,2,3,1,1});
//solve4(new int[]{0,1,2,3,1,1});
}
static void solve1(int[] arr) {
Arrays.sort(arr);
System.out.println(arr[arr.length / 2]);
}
/*不同的数,进行消除,O(N)*/
public static void solve4(int[] arr)
{
//候选数,先定位第一个元素
int candidate=arr[0];
//出现的次数
int nTimes=1;
//扫描数组
for (int i = 0; i < arr.length; i++)
{
//两两消减为0,应该把现在的元素作为候选值
if (nTimes==0)
{
candidate=arr[i];
nTimes=1;
continue;
}
//遇到和候选值相同的,次数加1
if (arr[i]==candidate)
nTimes++;
//不同的数,进行消减
else
nTimes--;
}
System.out.println(candidate);
}
//变化,出现次数恰好为个数的一半,求出这个数
/*
* 关于加强版水王的题我有个想法可以扫描一遍数组就解决问题:
水王占总数的一半,说明总数必为偶数;
不失一般性,假设隔一个数就是水王的id,两两不同最后一定会消减为0
水王可能是最后一个元素,每次扫描的时候,多一个动作,和最后一个元素做比较,单独计数,计数恰好等于一半
如果不是,计数不足一半,那么去掉最后一个元素,水王就是留下的那个candidate*/
public static void solve5(int[] arr) {
int candidate=arr[0];
int nTimes=0;
int countOfLast=0;//统计最后这个元素出现的次数
int N=arr.length;
for (int i = 0; i < N; i++)
{
//增加和最后一个元素比较的步骤
if (arr[i]==arr[N-1])
countOfLast++;
if (nTimes==0)
{
candidate=arr[i];
nTimes=1;
continue;
}
if (arr[i]==candidate)
nTimes++;
else
nTimes--;
}
//最后一个元素出现次数是n/2
if (countOfLast==N/2)
System.out.println(arr[N-1]);
else
System.out.println(candidate);
}
}