209. Minimum Size Subarray Sum

来源:互联网 发布:wow战斗数据不显示了 编辑:程序博客网 时间:2024/06/05 10:59

1、题目描述

输入一个正整数数组和整数s,找出数组中最短的序列,它的序列和大于或等于s。


2、思路

方法1:Two Pointers。

声明一个用于记录序列和的变量sum,一个用于记录序列左端的变量left。

遍历数组,在sum上加上当前数字,如果sum小于s,则继续向右扩充sum,使其增长;

若sum已经大于或等于s,则努力地向右移动left,即从sum中减掉尽可能多的左边的值,令sum仍大于或等于s;

更新left和sum,更新ans。

时间复杂度O(n),空间复杂度O(1)。


方法2:Binary Search.

更新数组,让数组的每个元素,都是前面所有元素和该元素的和。

对合法的序列长度进行二分查找。

l = 1, r = 数组长度,如果数组中有mid长度的序列和大于等于s,则令r = mid;

反之,令l = mid+1.

时间复杂度O(nlogn),空间复杂度O(1)。



方法3:Binary Search.

更新数组,让数组的每个元素,都是前面所有元素和该元素的和。

对于用每个元素开头的序列,用二分查找的方式找到最短的序列,使得序列和大于等于s。

时间复杂度O(nlogn),空间复杂度O(1)。



3、代码

方法1:

    int minSubArrayLen(int k, vector<int>& nums) {        int n = nums.size();        int ans = INT_MAX;        int sum=0;        int left = 0;        for(int i=0;i<n;i++){            sum+=nums[i];            while(sum-nums[left]>=k){                sum-=nums[left];                left++;            }            if(sum>=k)            ans=min(ans,i-left+1);        }        if(ans==INT_MAX) return 0;        return ans;    }


方法2:

    int minSubArrayLen(int k, vector<int>& nums) {        int n = nums.size();        for(int i=1;i<n;i++){            nums[i]+=nums[i-1];        }        if(n==0||nums[n-1]<k) return 0;        int l = 1 , r = n;        while(l<r){            int mid = l + (r - l) / 2;            if(isok(nums,k,mid))                r = mid;            else                l = mid+1;        }        return l;    }    bool isok(vector<int> nums, int k, int mid){        if(nums[mid-1]>=k) return true;        for(int i = mid;i <nums.size();i++){            if(nums[i]-nums[i-mid]>=k)                return true;        }        return false;    }




阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 脚底长瘊子怎么办 鱼鳞不好刮怎么办 腿上起白皮屑怎么办 轻微鱼鳞病怎么办 大腿根鱼鳞病怎么办 有鱼鳞病怎么办呢 腿皮肤干燥怎么办 小腿皮肤干燥怎么办 食道轻度增生怎么办 宫颈重度炎症怎么办 ipad变白苹果怎么办 ipad卡机后黑屏怎么办 苹果六白机怎么办 windows无法激活怎么办 苹果电脑卡住了怎么办 苹果无法激活怎么办 办公室好多老鼠怎么办 抽屉进老鼠怎么办 办公室发现老鼠怎么办 面试紧张怎么办? 深圳买不起房子怎么办 手刹放不下去怎么办 笔记本显卡不好怎么办 显卡性能不足怎么办 显示器有黑边怎么办 塑料发粘怎么办 平板卡死了怎么办 cpu超频怎么办 二氧化碳飞溅大怎么办 显卡配置低怎么办 纹身红色洗不掉怎么办 冬天纹身穿衣服怎么办 身上扁平疣怎么办 身上都是扁平疣怎么办 脸上有扁平疣怎么办 脸上很多扁平疣怎么办 脖子长扁平疣怎么办 身上长扁平疣怎么办 太依赖一个人怎么办 不干胶翘边怎么办 纹身增生怎么办