LeetCode - Mảng bội số của mảng gốc

Cho một mảng arr, tạo ra một mảng mới là mảng bội số của arrans. Trong đó các phần tử của ans là bội của toàn bộ các phần tử trong arr ngoại trừ arr[i]

Không được dùng phép chia trong bài toán này :smiley:

Phân tích time and space complexity.

Ví dụ có mảng: [1, 3, 7, 2] thì tạo ra mảng mới
[3*7*2, 1*7*2, 1*3*2, 1*3*7]


Được dùng mọi ngôn ngữ
Cần phân tích giải thuật


Có thể submit thử ở đây để coi giải thuật của mình tốt tới đâu

4 Likes

Leetcode :wink:
Cho em challenge mọi người là liệu có thể làm trong O(N) time không nhé

2 Likes

Google nhanh quá vậy =))

Để update luôn cái link cho mọi người lên test :slight_smile:

1 Like

bài này em làm lâu rồi chứ không GG a ơi :))

2 Likes

Mới submit code trên leetcode, code bằng C++.

17 / 17 test cases passed.
Status: Accepted
Runtime: 52 ms

Submit bằng C


17 / 17 test cases passed.
Status: Accepted
Runtime: 32 ms

Submit bằng Java


17 / 17 test cases passed.
Status: Accepted
Runtime: 2 ms

Thôi chuyển sang code Java cho nó lẹ :confused:

Submit bằng Python:


17 / 17 test cases passed.
Status: Accepted
Runtime: 162 ms

:joy:

1 Like

xét riêng trường hợp số 0
tính tích là P
với mỗi ans[i]=p*arr[i]^(-1); :stuck_out_tongue:
p/s: O(n) time O(1) extra space

17 / 17 test cases passed.
Status: Accepted
Runtime: 59 ms
class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        vector<int> res(nums.size());
        
        vector<int> leftToRight(nums.size(), 1);
        vector<int> rightToLeft(nums.size(), 1);
        
        for (int i = 1; i < leftToRight.size(); i++)
            leftToRight[i] = leftToRight[i - 1] * nums[i - 1];
            
        for(int i = rightToLeft.size() - 2; i >= 0; i--)
            rightToLeft[i] = rightToLeft[i + 1] * nums[i + 1];
            
        for(int i = 0; i < nums.size(); i++)
            res[i] = leftToRight[i] * rightToLeft[i];
        
        return res;
    }
};
2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?