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 };
复制代码

 


本文转自ZH奶酪博客园博客,原文链接:http://www.cnblogs.com/CheeseZH/p/5006769.html,如需转载请自行联系原作者

相关文章
Leetcode 53.Maximum Subarray
题意简单,给出一个数组,求出其中最大的子数组和。 这种简单题目背后蕴藏着很巧妙的解题方法。其实只需要遍历一次数组就可以求得解。 思路是这样的,你想想看,如果一段子数组的和是负数, 那么这一段子数组不可能是最大和数组的一部分,丢掉重新从下一个位置开始选。
46 0
LeetCode 209. Minimum Size Subarray Sum
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。
114 0
LeetCode 209. Minimum Size Subarray Sum
LeetCode 53. Maximum Subarray
给定整数数组nums,找到具有最大总和的子数组(数组要求连续)并且返回数组的和,给定的数组包含至少一个数字。
43 0
LeetCode之Max Consecutive Ones
LeetCode之Max Consecutive Ones
133 0