zoukankan      html  css  js  c++  java
  • [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 题目汇总

  • 相关阅读:
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
  • 原文地址:https://www.cnblogs.com/lightwindy/p/9760070.html
Copyright © 2011-2022 走看看