剑指Offer第二十三天:数学(简单)

这篇博客介绍了两种算法问题的解决方案。第一部分讲解了使用摩尔投票法找出数组中出现次数超过一半的数字,通过迭代更新众数候选和票数来实现。第二部分展示了如何构建一个新数组,使得新数组中每个元素是原数组中所有其他元素的乘积,通过正反遍历数组并计算乘积完成构建。
摘要由CSDN通过智能技术生成

剑指 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;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jomo.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值