LintCode 406 和大于S的最小子数组 渣渣学算法系列

本文探讨了如何在给定数组中寻找满足特定条件的最小子数组,即其元素和大于等于给定值s的最小长度子数组。通过使用同向双指针技术,实现了时间复杂度为O(n)的高效算法。

描述

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

样例:

输入: [2,3,1,2,4,3], s = 7
输出: 2
解释: 子数组 [4,3] 是该条件下的最小长度子数组。

样例 2:

输入: [1, 2, 3, 4, 5], s = 100
输出: -1

挑战

如果你已经完成了O(nlogn)时间复杂度的编程,请再试试 O(n)时间复杂度。
  • 解法:
  • 同向双指针
  • 每次删除左指针左边的数字
  • 只要当前和小于s,右指针继续向右移动
  • 时间复杂度O(n)
public class Solution {
    /**
     * @param nums: an array of integers
     * @param s: An integer
     * @return: an integer representing the minimum size of subarray
     */
    public int minimumSize(int[] nums, int s) {
        if( nums == null || nums.length == 0 || s==0)
            return -1;
            
        int tsum = 0;
        int minCount = Integer.MAX_VALUE;
        int count = 0;
        int i;int j = 0;
        boolean flag = false;
        for(i = 0 ; i < nums.length ; i ++){
            // System.out.println(tsum);
            if(i>0){
                tsum -= nums[i-1];
                count--;
            }
            
            for( ; j < nums.length ; j++){
            	//建议这里用while循环
            	//如果tsum<s即flag==false就空转一下,也就是不加nums[j],因为nums[j]已经在上一轮加过了
                if(flag==false){
                    tsum += nums[j];
                    count++;
                    
                }
                if(tsum>=s){
                    minCount = count < minCount ? count : minCount;
                    flag = true;
                    break;
                }else{
                    flag = false;
                }
                // System.out.println(count);
                // j = 4 , i = 1 , tsum = 11 ,count = 4
                // j = 4 , i = 2 , tsum = 8 , count = 3  tsum < s 
                //
            }
        }
        return minCount = minCount==Integer.MAX_VALUE?-1:minCount;
    }
}

截至2019/02/28 22:23 的运行结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值