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);

 

posted @ 2020-05-11 21:54  小树木  阅读(152)  评论(0编辑  收藏  举报