zoukankan      html  css  js  c++  java
  • 52. 数组中出现次数超过一半的数字

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

    假设数组非空,并且一定存在满足条件的数字。(来源:剑指Offer)

    思考题:

    • 假设要求只能使用 O(n)O(n) 的时间和额外 O(1)O(1) 的空间,该怎么做呢?

    样例

    输入:[1,2,1,1,3]
    
    输出:1
    class Solution {
    public:
        int moreThanHalfNum_Solution(vector<int>& nums) {
                    int count=1,val=nums[0];
                    for(int i =1;i<nums.size();i++){
                    if(nums[i]==val) count++;
                    else count--;
                    if(count ==0)
                    {  val=nums[i];
                    count = 1;
                    
                    
                    }           
                }
                return val;
                
        }
    
        
    };

    时间复杂度:

      O(n) 大概会想到for循环;

    空间复杂度:

    O(1)  就是不可以在重新分配空间

     怎么解释这个题呢! 就是说有一组数,出现最多,注意这个最多是超过总数的一半; 但又限制空间复杂度,如果没有空间复杂度直接可以用另建一个数组;  

      在这里用for()循环;  从开头开始遍历,这里的数组nums[0] 这个数初始化,而它的数量肯定是1;

      但是遇到与自己相同的就把数量加一,相反则减一; 减到0的时候,val=nums[i] 把此时下标为i的数值赋给val ,这又是一个新数,继续循环到最后; 这里只循环一遍,自然时间复杂度就是O(n);

     

  • 相关阅读:
    好多天没写了,郁闷
    昨天很受教育
    恼火的服务器
    欢迎访问我的博客网站
    体育产品论坛
    参考书目
    web2.0与数字标准
    用户产生内容与网站做内容
    Using x++ code reading data from csv file format
    Find out specified the folder for all the files
  • 原文地址:https://www.cnblogs.com/WLCYSYS/p/12872482.html
Copyright © 2011-2022 走看看