zoukankan      html  css  js  c++  java
  • Minimum Size Subarray Sum

    Given an array of n positive integers and a positive integer s, find the minimal length of a subarray of which the sum ≥ s. If there isn't one, return -1 instead.

    Example

    Given the array [2,3,1,2,4,3] and s = 7, the subarray [4,3] has the minimal length under the problem constraint.

    Challenge 

    If you have figured out the O(n) solution, try coding another solution of which the time complexity is O(n log n).

    Analyse: Two pointers. O(n)

    Runtime: 203ms

     1 class Solution {
     2 public:
     3     /**
     4      * @param nums: a vector of integers
     5      * @param s: an integer
     6      * @return: an integer representing the minimum size of subarray
     7      */
     8     int minimumSize(vector<int> &nums, int s) {
     9         // write your code here
    10         // mark left, set right as left + 1
    11         // move right until sum of nums[left...right] >= s
    12         // update the min length and let left move one position
    13         // if current sum >= s update min length and keep move left
    14         // if current sum < s move right one position
    15         
    16         if (nums.empty()) return -1;
    17         int left = 0, right = 1;
    18         int minSize = INT_MAX, tempSum = nums[left];
    19         if (tempSum > s) return 1;
    20         while (left < nums.size() && right < nums.size()) {
    21             tempSum += nums[right];
    22             while (tempSum >= s) {
    23                 minSize = min(minSize, right - left + 1);
    24                 tempSum -= nums[left];
    25                 left++;
    26             }
    27             if (tempSum < s) {
    28                 right++;
    29             }
    30         }
    31         return minSize == INT_MAX ? -1 : minSize;
    32     }
    33 };

    Analyse: Brute force. O(n^2)

    Runtime: 605ms

     1 class Solution {
     2 public:
     3     /**
     4      * @param nums: a vector of integers
     5      * @param s: an integer
     6      * @return: an integer representing the minimum size of subarray
     7      */
     8     int minimumSize(vector<int> &nums, int s) {
     9         // write your code here
    10         if (nums.empty()) return -1;
    11         
    12         int result = INT_MAX;
    13         for (int i = 0; i < nums.size(); i++) {
    14             int tempSum = nums[i];
    15             if (tempSum >= s) return 1;
    16             for (int j = i + 1; j < nums.size(); j++) {
    17                 tempSum += nums[j];
    18                 if (tempSum >= s) {
    19                     result = min(result, j - i + 1);
    20                     break;
    21                 }
    22             }
    23         }
    24         return result == INT_MAX ? -1 : result;
    25     }
    26 };
    View Code
  • 相关阅读:
    Error:java: Annotation processing is not supported for module cycles. Please ensure that all modules from cycle [web_dao,web_service] are excluded from annotation processing
    手把手教你springboot中导出数据到excel中
    MySql多表关联Update笔记
    Spring Security踩坑记录(静态资源放行异常)
    Can't find bundle for base name
    简单好用的对象映射器——Mapster
    YARP简介 —— IHttpProxy
    使用Let's Encrypt创建SSL证书
    使用Mono.Cecil动态添加资源文件
    给RapiDoc添加多接口支持
  • 原文地址:https://www.cnblogs.com/amazingzoe/p/5820400.html
Copyright © 2011-2022 走看看