[配列] C_5372。正の数の最小値を取得するために徐々に合計します(列挙/プレフィックス合計)

1.タイトルの説明

整数numsの配列を提供します。初期値として任意の正のstartValueを選択できます。

nums配列を左から右にトラバースし、nums配列の値を順番に累積する必要があります。

累積合計が常に1以上であることを確認し、startValueとして最小の正数を選択してください。

输入:nums = [-3,2,-3,4,2]
输出:5
解释:如果你选择 startValue = 4,在第三次累加时,和小于 1 。
                累加求和
                startValue = 4 | startValue = 5 | nums
                  (4 -3 ) = 1  | (5 -3 ) = 2    |  -3
                  (1 +2 ) = 3  | (2 +2 ) = 4    |   2
                  (3 -3 ) = 0  | (4 -3 ) = 1    |  -3
                  (0 +4 ) = 4  | (1 +4 ) = 5    |   4
                  (4 +2 ) = 6  | (5 +2 ) = 7    |   2

方法1:列挙

public int minStartValue(int[] nums) {
    int st = Integer.MAX_VALUE;
    int t = -1;

    for (int i = 1; i < Integer.MAX_VALUE; i++) {
        st = i;
        int sum = st;
        boolean flag = true;
        for (int j = 0; j < nums.length; j++) {
            sum += nums[j];
            if (sum < 1) {
                flag = false;
                break;
            }
        }
        if (flag) {
            return st;
        }
    }
    return st;
}

複雑さの分析

  • 時間の複雑さ: (...)
  • スペースの複雑さ: 1 O(1)

方法2:プレフィックスと

  • このように考えてください。目標は、累積プロセスに現れる最小のプレフィックスと値を1より大きくすることなので、
  • したがって、各累積後に得られた結果の最小値を記録する必要があります。
  • 最後に、式x-min> = 1は次のようになります:x = 1-min
public int minStartValue(int[] nums) {
    int prefix = 0, min = 0;
    for (int n : nums) {
        prefix += n;
        min = Math.min(min, prefix);
    }
    return 1 - min;
}

複雑さの分析

  • 時間の複雑さ: O(n)
  • スペースの複雑さ: 1 O(1)

元の記事714件を公開 賞賛された199件 50,000件以上の表示

おすすめ

転載: blog.csdn.net/qq_43539599/article/details/105616034