剑指 Offer 39. 数组中出现次数超过一半的数字
摩尔投票法:将nums[i]看作支持的号码牌,sum则是票数
1.当sum=0时,选举下一个数当众数,遍历数组
2.如果当前数和众数相等,则众数票数增加,sum++
3.如果不等,众数票数就减少,sum--
4.当sum减少到0时,说明支持者不够多,那意味着它不是众数,重新选举下一个数为众数
class Solution {
public:
int majorityElement(vector<int>& nums) {
if(nums.size()<=2){
return nums[0];
}
//先假定众数是nums[0],众数票数sum=1
int x=nums[0];
int sum=1;
for(int i=1;i<nums.size();i++){
if(sum==0){//说明要重新选举众数了
x=nums[i];
sum=1;
}else{
if(nums[i]==x){//和众数一样,向众数投票
sum++;
}else{//不一样则抵消
sum--;
}
}
}
return x;
}
};
剑指 Offer 66. 构建乘积数组
正反遍历数组:
class Solution {
public:
vector<int> constructArr(vector<int>& a) {
//由于b[i]抛弃的是a[i],因此我们可以通过正反遍历a数组达到只缺a[i]的效果
vector<int>b(a.size());
//遍历前初始化成1
int mul=1;
for(int i=0;i<a.size();i++){
b[i]=mul;
mul*=a[i];
}
//遍历前重新初始化成1
mul=1;
for(int i=a.size()-1;i>=0;i--){
b[i]*=mul;
mul*=a[i];
}
return b;
}
};