【问题标题】:Given an array of numbers, find a number to start with such that the sum is never negative给定一个数字数组,找到一个数字开头,使得总和永远不会为负
【发布时间】:2020-05-19 18:15:37
【问题描述】:

给定一个整数数组,找出最小的数 X 开始,这样数组的元素加到 X 上,总和总是大于 0

如果给定数组是 {-2, 3, 1, -5} 例如,在上面的数组中,X 应该是 4

说明: 如果我们从 4 开始,然后添加第一个数字 -2,则数组总和变为 4 + (-2) = 2(即 >0) 现在将下一个元素 3 添加到当前总和,即 2、2+ 3 = 5(即 >0) 将下一个元素 1 添加到新的总和 5 中得到 5 + 1 = 6(大于 0) 将最后一个元素 -5 添加到新的和 6 得到 6 + (-5) = 1,它再次大于零。

给定一个整数数组,我怎样才能找到最小的数 X?

【问题讨论】:

  • X 可以是负数吗?例如。给定的数组可以是 {2},所以 X = -1 可以工作。
  • @AndrewMorton,是的,X 也可以是负数

标签: arrays algorithm array-algorithms


【解决方案1】:

求给定数组的累积和的最小值。
需要的结果是1 - MinC

A = [-2, 3, 1, -5]
CSum = 0
MinC = 10000000000
for x in A:
    CSum += x
    MinC = min(MinC, CSum)
Addend = 1 - MinC
print(Addend)

>>> 4

【讨论】:

  • 赞成。谢谢。如果可以的话,我也想知道你解决这个问题的过程。
  • 我看到你描述的累积和它的最小值肯定对应于所需的值。看看你的总和没有“我们从 4 开始”
【解决方案2】:

首先我们应该检查 ith 位置的元素是否大于零。如果元素大于零,那么没有问题,我们可以直接将它添加到我们的总和中,ans 保持不变。但是如果不大于零,那么我们首先检查 sum 是否大于元素。如果 sum 大于 abs(arr[I]) 然后我们将 sum 减少 abs(arr[I])ans 保持不变,但如果 abs(arr[I]) 大于 sum 然后我们将 abs(arr[i]-sum+1) 添加到 ans 并将 sum 初始化为 1。

下面是相同的代码:

 #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    int main()
    {
        // considering x>=0(x can't take values less than 0)
        ll arr[] = { -2, 3, 1, -5};
        ll n = sizeof(arr) / sizeof(ll);
        ll ans = 0; // My answer
        ll sum = 0; // current sum of elements
        for (ll i = 0; i < n; i++)
        {
            if (arr[i] <= 0)
            {
                if ((sum + arr[i]) <= 0)
                {
                    ans += (abs(sum + arr[i]) + 1); //add 1 to make sum=1
                    sum = 1;
                }
                else
                    sum += arr[i];   // added because arr[i]<=0,(sum-=abs(arr[i]))
            }
            else
                sum += arr[i];
        }
        cout << ans;

        return 0;
    }
    // ans=4 for this case

【讨论】:

  • 如果所有元素都是正数会发生什么?它不会返回最小数量。
  • 是的,这就是我评论 ans 大于或等于 0 的原因。意味着如果所有人都是肯定的,我的答案将是 0
【解决方案3】:

你应该首先找到最小子数组和。可以说它等于k。 你的答案应该是 k+1。你可以在这里找到最低金额: https://www.geeksforgeeks.org/smallest-sum-contiguous-subarray/

【讨论】:

    【解决方案4】:

    这个问题可以用简单的逻辑来解决,方法是预先计算数组中所有元素的总和。

    求数组中所有元素的总和。

    如果 sum 等于 0,则返回 1,因为它会在相加时给出最小的数字,我们将得到大于零的总和。

    如果 sum 大于零,则返回一个小于该 sum 的负数(单独处理 sum == 1 的特殊情况

    如果总和为负,则返回仅比总和大一的正数。

    第 1 步:求数组中所有元素的总和

     int sum = 0;
    for(int i = 0; i < arr.size(); i++)
     {
             sum += arr[i];
     }
    

    第 2 步:检查所获得的总和并应用以下逻辑

    if(sum == 0)
             return 1;
    else if( sum < 0)
             return abs(sum)+1;
    else 
            {
                   if( sum == 1)
                              return 0;
                   else
                             return  -(sum-1);
    
             }      
    
    
    
     
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      相关资源
      最近更新 更多