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;
}
複雑さの分析
- 時間の複雑さ: 、
- スペースの複雑さ: 、
方法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;
}
複雑さの分析
- 時間の複雑さ: 、
- スペースの複雑さ: 、