zoukankan      html  css  js  c++  java
  • [Jobdu] 题目1370:数组中出现次数超过一半的数字

    题目描述:

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

    输入:

    每个测试案例包括2行:

    第一行输入一个整数n(1<=n<=100000),表示数组中元素的个数。

    第二行输入n个整数,表示数组中的每个元素,这n个整数的范围是[1,1000000000]。 

    输出:

    对应每个测试案例,输出出现的次数超过数组长度的一半的数,如果没有输出-1。

    样例输入:
    9
    1 2 3 2 2 2 5 4 2
    
    样例输出:
    2

    经典的题目,如果可以排序,就先排序,找n/2位置的元素,如果有,那么这个元素就是,但也有可能没有,所以要再检查一遍,该方法的时间复杂度为O(nlogn)。

    另外一种方法就是用一个栈来实现,对于当前元素,若栈空,则入栈,若栈不为空,与栈顶元素比较,相等则入栈,不等则弹出栈顶元素。如果有主元素,最后的栈顶一定是主元素。如果没有,同上面一样,最后的栈顶元素不一定是答案,所以最后还要检查一遍。该方法时间复杂度为O(n),可以只用一些标记来实现栈,因为栈里只可能有一种元素。空间复杂度可以做到O(1)。

     1 #include <iostream>
     2 #include <stack>
     3 using namespace std;
     4  
     5 int main()
     6 {
     7     int n;
     8     long a[100005];
     9  
    10     while (cin >> n) {
    11         for (int i=0; i < n; i++){
    12             cin >> a[i];
    13         }
    14         stack<int> s;
    15         for (int i=0; i < n; i++){
    16             if (s.empty() || s.top() == a[i]){
    17                 s.push(a[i]);
    18             } else {
    19                 s.pop();
    20             }
    21         }
    22         if (s.empty()) {
    23             cout << "-1" << endl;
    24         } else {
    25            int count = 0;
    26            for (int i = 0; i < n; ++i) 
    27                  if (a[i] == s.top()) ++count;
    28            if (count > n / 2) cout << s.top() << endl;
    29            else cout << "-1" << endl;
    30         }
    31     }
    32     return 0;
    33 }
    34 /**************************************************************
    35     Problem: 1370
    36     User: hupo250
    37     Language: C++
    38     Result: Accepted
    39     Time:90 ms
    40     Memory:2228 kb
    41 ****************************************************************/
  • 相关阅读:
    Pascal's Triangle II
    Pascal's Triangle
    Best Time to Buy and Sell Stock II
    Best Time to Buy and Sell Stock
    Populating Next Right Pointers in Each Node
    path sum II
    Path Sum
    [转载]小波时频图
    [转载]小波时频图
    [转载]Hilbert变换及谱分析
  • 原文地址:https://www.cnblogs.com/easonliu/p/3648436.html
Copyright © 2011-2022 走看看