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

注意:数组中有没有次数超过一半的数字。
方法1
运用数组的特性:数组中有一个数字的个数超过了数组长度的一半,那么这个数字一定是数组中的中位数。
基于快排算法 --> 求数组总第k大的数字 O(n)

public class Solution {

    public int Partition(int[] array, int l, int r) {
        int x = array[l];
        while (l < r) {
            while (l < r && array[r] >= x) r--;
            array[l] = array[r];
            while (l < r && array[l] <= x) l++;
            array[r] = array[l];
        }
        array[l] = x;
        return l;
    }

    public int MoreThanHalfNum_Solution(int[] array) {
        if (array == null) {
            return 0;
        }
        int mid = array.length >> 1;
        int l = 0, r = array.length - 1, index = 0;
        while (index != mid) {
            index = Partition(array, l, r);
            if (index > mid) {
                r = index - 1;
            } else if (index < mid) {
                l = index + 1;
            }
        }
        int count = 0;
        for (int i = 0; i < array.length; i++) {
            if (array[i] == array[index]) {
                count++;
            }
        }
        return count > mid ? array[index] : 0;
    }
}

方法2
遍历数组时保存两个值:一个是数字中的一个数字,另一个是次数。

public class Solution {
    public int MoreThanHalfNum_Solution(int[] array) {
        if (array == null) {
            return 0;
        }
        int count = 0, num = -1;
        for (int i = 0; i < array.length; i++) {
            if (count == 0) {
                count++;
                num = array[i];
                continue;
            }
            if (array[i] == array[i - 1]) {
                count++;
            } else {
                count--;
            }
        }
        count = 0;
        for (int i = 0; i < array.length; i++) {
            if (array[i] == num) {
                count++;
            }
        }
        return count > array.length / 2 ? num : 0;
    }
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
06-05 15:27
点赞 评论 收藏
分享
点赞 评论 收藏
分享
04-18 15:58
已编辑
门头沟学院 设计
kaoyu:这一看就不是计算机的,怎么还有个排斥洗碗?
点赞 评论 收藏
分享
06-04 18:37
门头沟学院 Java
勇敢的ssr求对象:前面看的有点奔溃,看到只有你是真玩啊,忍不住笑出了声😂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务