[LeetCode] 325. Maximum Size Subarray Sum Equals k 和等於k的最長子數組


Given an array nums and a target value k, find the maximum length of a subarray that sums to k. If there isn't one, return 0 instead.

Example 1:

Given nums = [1, -1, 5, -2, 3]k = 3,
return 4. (because the subarray [1, -1, 5, -2] sums to 3 and is the longest)

Example 2:

Given nums = [-2, -1, 2, 1]k = 1,
return 2. (because the subarray [-1, 2] sums to 1 and is the longest)

Follow Up:
Can you do it in O(n) time?

給一個數組nums和一個目標值k,找出子數組和是k的最大長度,如果沒有返回0.  要求O(n)時間復雜度。

解法1:雙指針,雙層循環計算所有的組合,判斷是否和為k,如果是,更新max_len。時間復雜度高,TLE

解法:循環數組,用一個變量 cur_sum 記錄到目前為止所有數組的和,如果等於k則更新max_len,在用一個 map 記錄累加和的index,技巧:因為是求最長數組,所以一個和只記錄第一次的index,以后出現的位置靠后,就不記錄了。如果cur_sum在hashmap 中,表示當前位置去掉hashmap中記錄的cur_sum - k的 index 的和等於k,  用兩個index的差更新max_len。

Java:

public int maxSubArrayLen(int[] nums, int k) {
    HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(); 
    int max = 0;
    int sum=0;
    for(int i=0; i<nums.length; i++){
        sum += nums[i];
 
        if(sum==k){
            max = Math.max(max, i+1);
        }  
 
        int diff = sum-k;
 
        if(map.containsKey(diff)){
            max = Math.max(max, i-map.get(diff));
        }
 
        if(!map.containsKey(sum)){
            map.put(sum, i);
        }
    }
  
    return max;
}  

Python: Time:  O(n), Space: O(n)

class Solution(object):
    def maxSubArrayLen(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: int
        """
        sums = {}
        cur_sum, max_len = 0, 0
        for i in xrange(len(nums)):
            cur_sum += nums[i]
            if cur_sum == k:
                max_len = i + 1
            elif cur_sum - k in sums:
                max_len = max(max_len, i - sums[cur_sum - k])
            if cur_sum not in sums:
                sums[cur_sum] = i  # Only keep the smallest index.
        return max_len 

Python: wo

class Solution():
    def maxSubarry(self, nums, k):
        m = {0: -1}
        sm = 0
        for i in range(len(nums)):
            sm += nums[i]
            if sm not in m:
                m[sm] = i
            if sm - k in m:
                max_len = max(max_len, i - m[sm-k])

        return max_len  

C++:

class Solution {
public:
    int maxSubArrayLen(vector<int>& nums, int k) {
        int sum = 0, res = 0;
        unordered_map<int, int> m;
        for (int i = 0; i < nums.size(); ++i) {
            sum += nums[i];
            if (sum == k) res = i + 1;
            else if (m.count(sum - k)) res = max(res, i - m[sum - k]);
            if (!m.count(sum)) m[sum] = i;
        }
        return res;
    }
};

  

類似題目:

[LeetCode] 53. Maximum Subarray 最大子數組

[LeetCode] 209. Minimum Size Subarray Sum 最短子數組之和

[LeetCode] 560. Subarray Sum Equals K 子數組和為K

Range Sum Query - Immutable

 

All LeetCode Questions List 題目匯總

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM