lintcode编程题 java实现:(一)和大于S的最小子数组

问题描述

给定一个由 n 个正整数组成的数组和一个正整数 s ,请找出该数组中满足其和 ≥ s 的最小长度子数组。如果无解,则返回 -1。

思路总结

采用双层for循环是可以的,但是这样的时间复杂度为O(N^2),所以可以使用while,外层依然使用for循环,内层证明不需要回退这样的话时间复杂度为O(N)

代码实现
public class MinimumSizeArry {
    public int minimumSize(int[] nums, int s) {
        int n = nums.length;
        int j = 0;
        int sum = 0;
        int minumunNum = Integer.MAX_VALUE;
        for (int i = 0; i < n; i++) {
            while (j < n && sum < s) {
                sum += nums[j];
                j++;
            }
            if (sum >= s) {
                minumunNum = Math.min(minumunNum, j - i);
            }
            sum -= nums[i];
        }
        if (minumunNum == Integer.MAX_VALUE) {
            return -1;
        }
        return minumunNum;
    }
}
总结

优化说明:

  • 优化思想通过两层for循环而来
  • 外层指针依然是依次遍历
  • 内层指针证明是否需要回退
//通过两层for循环改进算法
for(i=0;iwhile(jif(满足条件)
            j++;
           更新j状态
         else(不满足条件)
             break;
               }
     更新i状态;
}

你可能感兴趣的:(剑指offer算法题)