剑指offer:数组中出现次数超过一半的数字

题目描述:

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

测试样例:

例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

思路一(不推荐):

首先将容器中的数字排序,则排序结束后,相同的数字都在相邻位置,直接判断数组当前位置的数字与(数组位置+数组一半长度位置)的数字是否相等,相等则输出该数字。

代码:

时间复杂度O(nlogn),空间复杂度O(1)

import java.util.Arrays;
public class Solution {
    public int MoreThanHalfNum_Solution(int [] array) {
        if(array == null || array.length <= 0)
            return 0;
        int len = array.length / 2;
        Arrays.sort(array);
        for(int i = 0; i + len < array.length;i++)
            if(array[i] == array[i + len])
                return array[i];
        return 0;
    }
}

Runtime:15ms

思路二:

首先是输入是数字,介于0~9之间(晕我居然才知道)。所以我们可以首先建立一个含有10个元素的数组,然后用输入的数字作为下标以统计每个数字出现的次数。再对这个数组与长度的一半进行比较,输出结果。

代码:

时间复杂度O(n),空间复杂度O(1)

public class Solution {
    public int MoreThanHalfNum_Solution(int [] array) {
        if(array == null || array.length <= 0)
            return 0;
        int [] arr = new int [10];
        int len = array.length / 2;
        for(int i : array)
            arr[i]++;
        for(int j = 0;j < 10;j++)
            if(arr[j] > len)
                return j;
        return 0;
    }
}

Runtime:11ms

思路三:

如果有符合条件的数字,则它出现的次数比其他所有数字出现的次数和还要多。

在遍历数组时保存两个值:一是数组中一个数字,一个是次数。遍历下一个数字时,若它与之前保存的数字相同,则次数加1,否则次数减1;若次数为0,则保存下一个数字,并将次数置为1。遍历结束后,所保存的数字即为所求。然后再判断它是否符合条件即可。

代码:

时间复杂度O(n),空间复杂度O(1)

public class Solution {
    public int MoreThanHalfNum_Solution(int [] array) {
        if(array == null || array.length <= 0)
            return 0;
        int len = array.length;
        int times = 1, res = array[0];
        // 遍历每个元素,并记录次数;若与前一个元素相同,则次数加1,否则次数减1
        for(int i = 1; i < len; i++){
            if(times == 0){
                // 更新result的值为当前元素,并置次数为1
                res = array[i];
                times = 1;
            }else if(array[i] == res)
                times++;
            else
                times--;
        }
        times = 0;
        for(int num : array)
            if(num == res)
                times++;
        return (times > len / 2)? res : 0;
    }
}

Runtime:17ms

思路四:

利用HashMap存储

代码

时间复杂度O(n),空间复杂度O(n)

import java.util.HashMap;
import java.util.Map;
public class Solution {
    public int MoreThanHalfNum_Solution(int [] array) {
        if(array == null || array.length <= 0)
            return 0;
        HashMap <Integer,Integer> map = new HashMap <Integer,Integer>();
        for(int i = 0;i < array.length;i++){
            if(map.containsKey(array[i])){
                map.put(array[i], map.get(array[i])+1);
            }else{
                map.put(array[i], 1);
            }
        }
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            if(entry.getValue() > array.length/2)
                return entry.getKey();
        }
        return 0;
    }
}

Runtime:12ms

------至所有正在努力奋斗的程序猿们!加油!!
有码走遍天下 无码寸步难行
1024 - 梦想,永不止步!
爱编程 不爱Bug
爱加班 不爱黑眼圈
固执 但不偏执
疯狂 但不疯癫
生活里的菜鸟
工作中的大神
身怀宝藏,一心憧憬星辰大海
追求极致,目标始于高山之巅
一群怀揣好奇,梦想改变世界的孩子
一群追日逐浪,正在改变世界的极客
你们用最美的语言,诠释着科技的力量
你们用极速的创新,引领着时代的变迁

——乐于分享,共同进步,欢迎补充
——Treat Warnings As Errors
——Any comments greatly appreciated
——Talking is cheap, show me the code
——诚心欢迎各位交流讨论!QQ:1138517609
——CSDN:https://blog.csdn.net/u011489043
——简书:https://www.jianshu.com/u/4968682d58d1
——GitHub:https://github.com/selfconzrr

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BugFree_张瑞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值