• Lintcode: Minimum Subarray


    C++

    Divide-Conquer[71% passed]

     1 class Solution {
     2 public:
     3     /**
     4      * @param nums: a list of integers
     5      * @return: A integer denote the sum of minimum subarray
     6      */
     7     int minSubArray(vector<int> nums) {
     8         // write your code here
     9         int n = nums.size();
    10         if (n == 1) {
    11             return nums[0];
    12         }
    13         int *arr = nums.data();
    14         return helper(arr, n);
    15     }
    16     int helper(int *arr, int n) {
    17         // terminate
    18         if ( n == 1 ) {
    19             return arr[0];
    20         }
    21         // divide
    22         int mid = n>>1;
    23         int ans = min(helper(arr, mid), helper(arr + mid, n - mid));
    24         // conquer
    25         int now = arr[mid - 1], may = now;
    26         for (int i = mid-2; i >= 0; --i) {
    27             may = min(may, now += arr[i]);
    28         }
    29         now = may;
    30         for (int i = mid; i <= n; ++i) {
    31             may = min(may, now += arr[i]);
    32         }
    33         // return
    34         return min(may, ans);
    35     }
    36 };

    C++, dp

     1 class Solution {
     2 public:
     3     /**
     4      * @param nums: a list of integers
     5      * @return: A integer denote the sum of minimum subarray
     6      */
     7     int minSubArray(vector<int> nums) {
     8         // write your code here
     9         int n = nums.size();
    10         if (n == 1) {
    11             return nums[0];
    12         }
    13         vector<int> dp(n);
    14         dp[0] = nums[0];
    15         int ans = nums[0];
    16         for (int i = 1; i < n ; ++i) {
    17             dp[i] = min(nums[i], dp[i - 1]+nums[i]);
    18             ans = min(dp[i], ans);
    19         }
    20         return ans;
    21     }
    22 };

    C++,dp,O(1) space

     1 class Solution {
     2 public:
     3     /**
     4      * @param nums: a list of integers
     5      * @return: A integer denote the sum of minimum subarray
     6      */
     7     int minSubArray(vector<int> nums) {
     8         // write your code here
     9         int n = nums.size();
    10         if (n == 1) {
    11             return nums[0];
    12         }
    13         int endHere = nums[0];
    14         int ans = nums[0];
    15         for (int i = 1; i < n ; ++i) {
    16             endHere = min(nums[i], endHere+nums[i]);
    17             ans = min(endHere, ans);
    18         }
    19         return ans;
    20     }
    21 };
  • 相关阅读:
    netstat
    ansibe tower的开源替代品semaphore
    ansible playbook 示例
    centos6 安装python2.7
    python celery + redis
    flask + uwsgi 生产环境
    ubuntu访问supermicro ikvm
    [leetcode]Symmetric Tree
    [leetcode]Pascal's Triangle
    [leetcode]Letter Combinations of a Phone Number
  • 原文地址:https://www.cnblogs.com/CheeseZH/p/5006769.html
Copyright © 2020-2023  润新知