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);
转发无需备注,如有错误,恳求读者指出,发送到wu13213786609@outlook.com。