leetcode刷题记录

本文解析了LeetCode上的构建乘积数组问题,提供了一种高效解决方案,避免使用除法,通过两次遍历数组实现左右两边元素乘积的计算。

工作之余刷刷题排解下寂寞-1
面试题66. 构建乘积数组:https://leetcode-cn.com/problems/gou-jian-cheng-ji-shu-zu-lcof/
解题思路:题目要求可以简化为求数组中任意一个元素左右两边所有元素的乘积。(偷懒就用了一个套路,练习了p/c/c++)
python:

class Solution:
    def constructArr(self, a: List[int]) -> List[int]:
        #除法是最简单的但是题目不能用,想对于b中任意一个结果,正好是b【i】左边的乘积*右边的乘积
        if not a:
            return []
        #i左边每一位乘积
        res=[]
        left=1
        right=1
        for i in range(len(a)):
            #要延迟一位
            res.append(left)
            left=left*a[i]
        #同理右边再乘上左边的结果
        for i in range(len(a)-1,-1,-1):
            #延迟一位
            res[i]=res[i]*right
            right=right*a[i]
        return res
    

类似C++

class Solution {
public:
    vector<int> constructArr(vector<int>& a) {
        //类似前面python的方法
        vector<int> res;
        if(a.size()==0){
            return res;
        }
        //左边
        int left_start=1;
        int right_start=1;
        //i的左边
        for(int i=0;i<a.size();i++){
            res.push_back(left_start);
            left_start*=a[i];
        }
        //左边再乘右边的结果
        for(int i=a.size()-1;i>=0;i--){
            res[i]*=right_start;
            right_start*=a[i];
        }
        return res;

    }
};

C:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* constructArr(int* a, int aSize, int* returnSize){
    //结果
    int* res=(int*)malloc(sizeof(int)*aSize);
    int left=1;
    int right=1;
    //左边
    for(int i=0;i<aSize;i++){
        res[i]=left;
        left*=a[i];
    }
    for(int i=aSize-1;i>=0;i--){
        res[i]*=right;
        right*=a[i];
    }
    *returnSize=aSize;
    return res;


}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值