LintCode 1310: Product of Array (数组好题)

  1. Product of Array Except Self
    Given an array of n integers where n > 1, nums, return an array output such that output[i] is equal to the product of all the elements of nums except nums[i].

Example
For example, given [1,2,3,4], return [24,12,8,6].

Challenge
Could you solve it with constant space complexity? (Note: The output array does not count as extra space for the purpose of space complexity analysis.)

Notice
Solve it without division and in O(n).

解法1:
思路:用两个array: forward 和 backward。

代码如下:

class Solution {
public:
    /**
     * @param nums: an array of integers
     * @return: the product of all the elements of nums except nums[i].
     */
    vector<int> productExceptSelf(vector<int> &nums) {
        
        int len = nums.size();
        
        if (len == 0) return vector<int>();
        if (len == 1) return nums;
        
        vector<int> result(len, 0);
        vector<int> forward(len, 0);
        vector<int> backward(len, 0);
        
        forward[0] = nums[0];
        for (int i = 1; i < len; ++i) {
            forward[i] = forward[i - 1] * nums[i];
        }

        backward[len - 1] = nums[len - 1];
        for (int i = len - 2; i >= 0; --i) {
            backward[i] = backward[i + 1] * nums[i];
        }
        
        for (int i = 1; i < len - 1; ++i) {
            result[i] = forward[i - 1] * backward[i + 1];
        }
        result[0] = backward[1];
        result[len - 1] = forward[len - 2];
        
        return result;
    }
};

解法2:一个array,直接基于return array操作。反向数组用一个变量代替即可。
代码如下:

class Solution {
public:
    /**
     * @param nums: an array of integers
     * @return: the product of all the elements of nums except nums[i].
     */
    vector<int> productExceptSelf(vector<int> &nums) {
        
        int len = nums.size();
        
        if (len == 0) return vector<int>();
        if (len == 1) return nums;
        
        vector<int> result(len, 1);
        for (int i = 1; i < len; ++i) { 
             //note result[i] only records the forward product of i - 1
            result[i] = result[i - 1] * nums[i - 1];
        }

        int backwardProduct = 1;
        for (int i = len - 1; i >= 0; --i) {
            result[i] = result[i] * backwardProduct;
            backwardProduct *= nums[i];
        }
         
        return result;
    }
};

二刷:

class Solution {
public:
    /**
     * @param nums: an array of integers
     * @return: the product of all the elements of nums except nums[i].
     */
    vector<int> productExceptSelf(vector<int> &nums) {
        int n = nums.size();
        vector<int> res(n, 1);
        res[0] = nums[0];
        for (int i = 1; i < n - 1; i++) {
            res[i] = res[i - 1] * nums[i];
        }
        int backwardProd = 1;
        for (int i = n - 1; i >= 1; i--) {
            res[i] = res[i - 1] * backwardProd;
            backwardProd *= nums[i];
        }
        res[0] = backwardProd;
        return res;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值