Skip to content

3511. Make a Positive Array

  • Time: $O(n)$
  • Space: $O(1)$
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
 public:
  int makeArrayPositive(vector<int>& nums) {
    constexpr long kMax = 1'000'000'000'000'000'000;
    int ans = 0;
    long minSum = nums[0] + nums[1];
    vector<long> bigNums{nums.begin(), nums.end()};

    for (int i = 2; i < bigNums.size(); ++i) {
      const long a = bigNums[i - 2];
      const long b = bigNums[i - 1];
      const long c = bigNums[i];
      minSum = min(minSum + c, a + b + c);
      if (minSum <= 0) {
        bigNums[i] = kMax;
        minSum = kMax;
        ++ans;
      }
    }

    return ans;
  }
};
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
  public int makeArrayPositive(int[] nums) {
    final long kMax = 1_000_000_000_000_000_000L;
    int ans = 0;
    long minSum = nums[0] + nums[1];
    long[] bigNums = Arrays.stream(nums).mapToLong(i -> i).toArray();

    for (int i = 2; i < bigNums.length; ++i) {
      final long a = bigNums[i - 2];
      final long b = bigNums[i - 1];
      final long c = bigNums[i];
      minSum = Math.min(minSum + c, a + b + c);
      if (minSum <= 0) {
        bigNums[i] = kMax;
        minSum = kMax;
        ++ans;
      }
    }

    return ans;
  }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class Solution:
  def makeArrayPositive(self, nums: list[int]) -> int:
    MAX = 10**18
    ans = 0
    minSum = nums[0] + nums[1]

    for i in range(2, len(nums)):
      a, b, c = nums[i - 2], nums[i - 1], nums[i]
      minSum = min(minSum + c, a + b + c)
      if minSum <= 0:
        nums[i] = MAX
        minSum = MAX
        ans += 1

    return ans