找出数组中出现一半以上次数的数字
2017-04-08 17:40
211 查看
网上有很多关于这题的解析,目前我看到最有的解法就是计数删除法,但代码很抽象,比较难理解,下面我谈谈自己理解,主要是为了加深印象。
public int MoreThanHalfNum_Solution(int [] array) {
//先检验输入是否合法,此处默认输入不合法时也输出为0
if(array.length==0||array==null)
return 0;
int count = 1;
int res = array[0];
for(int i=1;i<array.length;i++){
if(count==0){
res = array[i];
count++;
}else{
if(array[i]==res){
count++;
}else{
count--;
}
}
}
if(isMoreThanHalf(array,res))
return res;
return 0;
//检测总次数是否超过数组长度的一半
}
private boolean isMoreThanHalf(int[] arr,int res){
int count = 0;
for(int i=0;i<arr.length;i++){
if(arr[i]==res)
count++;
}
if(count*2>arr.length)
return true;
return false;
}
计数删除法的核心是每次删除数组中不同的两个数,则数组剩下的元素中原先占据一半以上的元素不会改变,当最后只剩下一个元素的时候,就是我们想要的结果。
我们用数组{1,2,1,3,1,4,1,5,1}举例说明。首先我们定义 count = 1, res = array[0] = 1, 可以认为它表示当前待删除元素是 res= 1, 且数量是1; 接着继续遍历数组,此时count = 1, 我们需要比较下一个元素array[1] 和res 是否相等,相等的情况下,count ++,count = 2, 意味着待删除元素res存在两个,继续遍历下一个元素; 不相等的话,意味着我们找到了要删除的另外一个元素,此时
count--, 显然,属于第二种情况,我们删除了两个元素,此时 count = 0;
数组遍历到第三个元素,此时count ==0 ,表示待删除元素个数为 0 ,所以无论如何,都要把当前元素标记为待删除元素 res= arr[2] , count = 1;以此类推直至遍历结束,res 就是我们想要的结果。
过程中最重要的是对 count 的理解,它表示的是当前待删元素的个数, count==0时意味着待删除元素个数为0,所以下一个元素一定要标记为待删除元素,且令 count = 1; count!=0 时,我们需要判断下一个元素是否与待删除元素相同,相同的话,count++; 不同时表示我们找到了另外一个单删除的元素,此时可以进行删除, count--;
public int MoreThanHalfNum_Solution(int [] array) {
//先检验输入是否合法,此处默认输入不合法时也输出为0
if(array.length==0||array==null)
return 0;
int count = 1;
int res = array[0];
for(int i=1;i<array.length;i++){
if(count==0){
res = array[i];
count++;
}else{
if(array[i]==res){
count++;
}else{
count--;
}
}
}
if(isMoreThanHalf(array,res))
return res;
return 0;
//检测总次数是否超过数组长度的一半
}
private boolean isMoreThanHalf(int[] arr,int res){
int count = 0;
for(int i=0;i<arr.length;i++){
if(arr[i]==res)
count++;
}
if(count*2>arr.length)
return true;
return false;
}
计数删除法的核心是每次删除数组中不同的两个数,则数组剩下的元素中原先占据一半以上的元素不会改变,当最后只剩下一个元素的时候,就是我们想要的结果。
我们用数组{1,2,1,3,1,4,1,5,1}举例说明。首先我们定义 count = 1, res = array[0] = 1, 可以认为它表示当前待删除元素是 res= 1, 且数量是1; 接着继续遍历数组,此时count = 1, 我们需要比较下一个元素array[1] 和res 是否相等,相等的情况下,count ++,count = 2, 意味着待删除元素res存在两个,继续遍历下一个元素; 不相等的话,意味着我们找到了要删除的另外一个元素,此时
count--, 显然,属于第二种情况,我们删除了两个元素,此时 count = 0;
数组遍历到第三个元素,此时count ==0 ,表示待删除元素个数为 0 ,所以无论如何,都要把当前元素标记为待删除元素 res= arr[2] , count = 1;以此类推直至遍历结束,res 就是我们想要的结果。
过程中最重要的是对 count 的理解,它表示的是当前待删元素的个数, count==0时意味着待删除元素个数为0,所以下一个元素一定要标记为待删除元素,且令 count = 1; count!=0 时,我们需要判断下一个元素是否与待删除元素相同,相同的话,count++; 不同时表示我们找到了另外一个单删除的元素,此时可以进行删除, count--;
相关文章推荐
- 找出数组中出现次数超过一半的数字
- 【c语言】数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字
- 找出数组里出现次数超过一半的数字
- 数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。
- 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字
- 数组中有一个数字出现的次数超过数组的一半,请找出这个数字
- 数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字
- 面试题29:找出数组中出现次数超过一半的数字-基于partition函数以及分摊法
- 数组中有一个数字出现的次数超过了数组长度的一半,找出这个数
- 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
- C++数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。
- 消除原理____假设数组中有一个数字出现的次数超过了数组长度的一半,试编程找出这个数字(qosrt 快速排序 哈希)
- 数组中一个数字出现的次数超过了数组长度的一半,找出这个数字
- ※ Leetcode - Array - 169. Majority Element(快速找出数组中出现过一半以上次数的数,3种写法)
- 找出一个数组中出现次数超过一半的那个数字,要求时间复杂度O(n)和空间复杂度为O(1)。
- C++数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。(牛客剑指offer)
- 数组中有一个数字出现的次数超过了数组长度的一半,请找出这个数。java实现
- 找出数组中出现次数超过一半的数字
- 数组中有一个数字出现的次数超过了数组长度的一半,请找出这个数字。
- 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在