簡體   English   中英

零子序列問題 - 我的 C++ 解決方案有什么問題?

[英]Zero Subsequences problem - What's wrong with my C++ solution?

問題陳述:給定一個包含 n 個整數的數組 arr,計算給定數組的非空子序列的數量,使得它們的最大元素和最小元素的乘積為零。 由於這個數字可能很大,因此以 10 ^ 9 + 7 為模計算一個數組的子序列定義為通過從數組中刪除幾個元素(可能沒有)而不改變剩余元素的順序而獲得的序列。

示例 給定 n = 3,arr = [1, 0, – 2]。

arr 有 7 個子序列是-

[1],最小值 = 1,最大值 =1,最小值 * 最大值 = 1。

[1,0] 最小值 = 0,最大值 = 1,最小值 * 最大值 = 0

[ 1,0, – 2],最小值 = – 2,最大值 =1,最小值 * 最大值 = -2。

[0],最小值=0,最大值=0,最小值*最大值=0

[0,-2],最小值=-2,最大值=0,最小值*最大值=0,

[1, -2] 最小值=-2,最大值=1,最小值* 最大值=-2

[- 2] 最小值 =-2 最大值 = – 2,最小值 * 最大值 = 4。

有 3 個最小 * 最大 = 0 的子序列是

[1, 0], [0], [0, – 2]。 因此答案是3

我試圖想出一個解決方案,通過計算零、正數和負數的數量,然后將可能的子序列(2^n,每個計數)添加到一個空變量。

我的答案很遙遠,預期答案是 3 時是10。有人可以指出我的錯誤嗎?

#include<bits/stdc++.h>
using namespace std;
#define int long long

int zeroSubs(vector<int> arr){
    int x = 0, y = 0, z = 0, ans = 0;
    for(int i = 0; i < arr.size(); i++){
        if(arr[i] == 0) z++;
        else if(arr[i] < 0) x++;
        else y++;
    }
    ans += ((int)pow(2, z))*((int)pow(2, x));
    ans += ((int)pow(2, y))*((int)pow(2, z));
    ans += ((int)pow(2, z));

    return ans;
}

int32_t main()
{
//directly passed the sample test case as an array
    cout<<zeroSubs({1, 0, -2});
    return 0;
}
ans += ((1<<z)-1)*((1<<x)-1);
ans += ((1<<y)-1)*((1<<z)-1);
ans += ((1<<z)-1);

在邏輯上做了這個小改動,非常感謝大家的寶貴反饋。 現在可以了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM