题目
给你一个整数数组 nums 。你可以选定任意的 正数 startValue 作为初始值。
你需要从左到右遍历 nums 数组,并将 startValue 依次累加上 nums 数组中的值。
请你在确保累加和始终大于等于 1 的前提下,选出一个最小的 正数 作为 startValue 。
思路
利用一个数值,计算整个数组的每个位置的累加和。如果累加和小于当前最小的累加和,则改变当前最小的累加和。通过最后的最小累加和,来获得结果。
如果这个数都是永远大于等于0的,因为题目要求每次的累加和都要大于等于1且要求最小的正整数startValue.因此此时我们的最小正整数可以取1就可以保证最终结果一定大于等于1.
如果这个最小结果是一个负数,但是因为最终题目要求结果一定要大于等于1,所以要在返回负数的绝对值基础上加上1即可。
代码
class Solution {
public int minStartValue(int[] nums) {
int min=Integer.MAX_VALUE;//记录累加和的最小数值
int length=nums.length;
int result=0;//当前累加和
for(int i=0;i<length;++i)
{
result+=nums[i];
if (result<min)
{
min=result;
}
}
if (min>=0)//如果累加和一直大于等于0,直接返回最小正数1
return 1;
else//如果累加和小于0,则返回负数绝对值加上1
{
return Math.abs(min)+1;
//return -(min-1);
}
}
}
结果
这道题,简单的暴力题,而且我也想不到有什么地方可以改进的,最多就是最后在min为负数的时候,直接返回-(min-1)而不要调用函数,这样会快一点点。
改进思路
嗯,看了一下题解,累加和还可以从1开始。
如果min值大于等于1,就直接返回1即可【因为1作为最小正整数时已经能够保证结果都是大于等于1的了】
当结果小于1的时候,就需要返回绝对值加2,假设这个时候的结果为0,但是result是从1开始的,从1开始的话,最低结果是0,所以,从2开始的话,最低结果就是1了。
当结果是负数的时候,最小正数为1的时候,结果还是负数【有多1去抵消还是负数,所以,当绝对值加1的时候,结果就是0,当绝对值加2的时候,结果就是1.】
代码
class Solution {
public int minStartValue(int[] nums) {
int min=Integer.MAX_VALUE;
int length=nums.length;
int result=1;//最小正整数
for(int i=0;i<length;++i)
{
result+=nums[i];
if (result<min) min=result;
}
//最后面这一句,利用了一个三元表达式,虽然代码量短,不过如果不注释,还是比较难以看懂的,自己写代码就没问题,以后还是要避免这样,免得被砍
return min>=1?1:Math.abs(min)+1;
}
}
结果
虽然时间还是0ms,但是我相信这个是测试数据不大的缘故,但是内存还是减少了一点点,也算一点点改进【狗头保命】