美文网首页算法提高之LeetCode刷题
找出数组中次数超过n/2或n/3的数

找出数组中次数超过n/2或n/3的数

作者: I讨厌鬼I | 来源:发表于2019-05-08 14:21 被阅读0次

题目描述

找出数组中出现次数超过n/2的数。

输入:

7
1 2 1 3 1 1 4

输出:

1

思路:

找出两个不相同的数消除,最终剩下的一定是超过一半的数。

代码:

import java.util.*;
public class Main {
    public static void main(String arg[]){
        Scanner in = new Scanner(System.in);
        while (in.hasNext()){
            int n = in.nextInt();
            int nums[] = new int[n];
            for (int i=0; i<n; i++){
                nums[i] = in.nextInt();
            }
            int res = nums[0], count = 1;
            for (int i=1; i<n; i++){
                if (nums[i] == res){
                    count++;
                }
                else {
                    if (count == 0){
                        res = nums[i];
                        count = 1;
                    }
                    else {
                        count--;
                    }
                }
            }
            System.out.println(res);
        }
    }
}

题目描述

找出数组中出现次数超过n/3的数,样例保证该数唯一。

输入:

7
1 2 1 3 1 2 4

输出:

1

思路:

当找到3个互不相同的数时进行消除,最终留下两个数,再遍历一遍看两个数出现的次数即可。

代码:

import java.util.*;
public class Main {
    public static void main(String arg[]){
        Scanner in = new Scanner(System.in);
        while (in.hasNext()){
            int n = in.nextInt();
            int nums[] = new int[n];
            for (int i=0; i<n; i++){
                nums[i] = in.nextInt();
            }
            int a = 0, countA = 0, b = 0, countB = 0;
            for (int i=0; i<n; i++){
                if (a == nums[i]) countA++;
                else if (b == nums[i]) countB++;
                //每一个与a和b都不同的数都会让a、b的数量减1
                else {
                    //当a、b的数量为0的时候自然换上新的数
                    if (countA == 0){
                        a = nums[i];
                        countA = 1;
                    }
                    else if (countB == 0){
                        b = nums[i];
                        countB = 1;
                    }
                    else {
                        countA--;
                        countB--;
                    }
                }
            }
            //出现超过n/3的数必定为a、b中的一个
            countA = 0;
            countB = 0;
            for (int i=0; i<n; i++){
                if (nums[i] == a) countA++;
                if (nums[i] == b) countB++;
            }
            int res;
            if (countA > n/3) res = a;
            else res = b;
            System.out.println(res);
        }
    }
}

相关文章

  • 找出数组中次数超过n/2或n/3的数

    题目描述 找出数组中出现次数超过n/2的数。 输入: 输出: 思路: 找出两个不相同的数消除,最终剩下的一定是超过...

  • 229. Majority Element II

    题目 题目很简短,给定一个包含n个数字的数组,找出所有出现次数超过 ⌊ n/3 ⌋ 次的数。要求O(n)时间复杂度...

  • 高效寻找数组中的“众数” - 摩尔投票法

    问题:在长度为n的数组中找出重复次数超过n/2的数(假设一定存在)。 存在O(n)的时间复杂度和O(1)的空间复杂...

  • 找出数组中的主要元素(leetcode169)

    题目 给定一个长度为n的数组,找出主要元素,主要元素的定义是在数组中出现的次数超过n/2 假设数组非空并且给定的数...

  • Majority Element II(leetcode229)

    题目 给定一个长度为n的数组,找出其中所有出现次数超过n/3的元素 要求使用线性时间和常数空间 举例输入[3,2,...

  • 229. Majority Element II

    给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。 摩尔投票法 大于 n/3 的数最...

  • 找出主要元素

    题目: leetcode169给出一个size为n的数组,找出主要元素,即出现次数超过n/2次的元素 思路一: 用...

  • 算法 - 数组主元素(出现次数超过一半的元素)

    题目: 整数数组,包含n个元素 主元素 - 某个元素出现次数 > n/2 是否存在主元素 找出主元素 举个例子 数...

  • 《剑指Offer》之数据结构篇

    1. 长度为n数组,数字在 0~n-1 范围内,找出数组中任意一个重复的数 O(n) 2. 不修改数组找出重复数字...

  • Leetcode.169.Majority Element

    题目 给定一个非空长度为n的数组, 数组中有一个数超过n/2, 输出该数. 思路1 通过map记录每个数出现的次数...

网友评论

    本文标题:找出数组中次数超过n/2或n/3的数

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