1413. 逐步求和得到正数的最小值『简单』
题目来源于力扣(LeetCode)
一、题目
题目相关标签:数组
提示:
1 <= nums.length <= 100
-100 <= nums[i] <= 100
二、解题思路
2.1 暴力法
-
从数字 1 到 Integer.MAX_VALUE 开始遍历
-
如果数字 1 能够对 nums 数组进行累加求和的操作,且累加和始终大于 0,则返回结果数字 1
-
否则数字 1 每次加 1 继续循环操作
2.2 遍历求和取最小值方式
-
遍历一遍 nums 数组,记录下累加和的最小值
-
最小值为正数时,说明 nums 数组中的累加和始终大于等于 1,则返回最小正数 1
-
最小值为负数时,则取最小值的绝对值,且需要加 1,才能保证该数对 nums 数组进行累加和时,结果始终大于等于 1
三、代码实现
3.1 暴力法
public static int minStartValue(int[] nums) {
// 从正数 1 开始,对数组进行累加的操作
for (int i = 1; i < Integer.MAX_VALUE; i++) {
int sum = i;
for (int j = 0; j < nums.length; j++) {
sum += nums[j];
// 累加和小于 1 时,结束内层循环
if (sum < 1) {
break;
}
// 内层循环,即遍历到 nums 的最后一位时,返回正确结果
if (j == nums.length - 1) {
return i;
}
}
}
return 0;
}
3.2 遍历求和取最小值方式
public static int minStartValue(int[] nums) {
// 定义最小值
int minSum = Integer.MAX_VALUE;
// 初始累加和为 0
int sum = 0;
for (int num : nums) {
// 累加求和的结果
sum += num;
// 记录下最小的和
minSum = Math.min(minSum, sum);
}
// minSum 为正数时,返回最小正数 1
if (minSum >= 0) {
return 1;
}
// minSum 为负数时,返回 负数取反 + 1
else {
return 1 - minSum;
}
}
四、执行用时
4.1 暴力法
4.2 遍历求和取最小值方式
五、部分测试用例
public static void main(String[] args) {
int[] arr = {-3, 2, -3, 4, 2}; // output:5
// int[] arr = {1, 2}; // output:1
// int[] arr = {1, -2, -3}; // output:5
int result = minStartValue(arr);
System.out.println(result);
}