码迷,mamicode.com
首页 > 其他好文 > 详细

[LintCode] 1844. subarray sum equals k II

时间:2020-03-18 09:33:00      阅读:42      评论:0      收藏:0      [点我收藏+]

标签:render   map   put   output   sub   ash   actual   new   +=   

Given an array of integers and an integer k, you need to find the minimum size of continuous subarrays whose sum equals to k, and return its length.

if there are no such subarray, return -1.

Example

Example1

Input: nums = [1,1,1,2] and k = 3
Output: 2

Example2

Input: nums = [2,1,-1,4,2,-3] and k = 3
Output: 2

Notice

the integer nums[i] may lower than 0

 

Solution 1: O(N^2) TLE

public class Solution {
    /**
     * @param nums: a list of integer
     * @param k: an integer
     * @return: return an integer, denote the minimum length of continuous subarrays whose sum equals to k
     */
    public int subarraySumEqualsKII(int[] nums, int k) {
        // write your code here
        int[] prefix = new int[nums.length];
        for (int i = 0; i < nums.length; i++) {
            if (i == 0) {
                prefix[i] = nums[i];
                continue;
            }
            prefix[i] = prefix[i - 1] + nums[i];
        }
        System.out.println(Arrays.toString(prefix));
        
        int res = Integer.MAX_VALUE;
        for (int i = 0; i < nums.length; i++) {
            for (int j = i; j < nums.length; j++) {
                if (i == 0) {
                    if (prefix[j] == k) {
                        res = Math.min(res, j + 1);
                    }
                    continue;
                }
                if (prefix[j] - prefix[i - 1] == k) {
                    res = Math.min(res, j - i + 1);
                }
            }
        }
        return res == Integer.MAX_VALUE ? -1 : res;
    }
}

 

Solution 2:

public class Solution {
    /**
     * @param nums: a list of integer
     * @param k: an integer
     * @return: return an integer, denote the minimum length of continuous subarrays whose sum equals to k
     */
    public int subarraySumEqualsKII(int[] nums, int k) {
        // write your code here
        Map<Integer, Integer> map = new HashMap<>();
        int sum = 0;
        int res = Integer.MAX_VALUE;
        map.put(0, -1);
        
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
            if (map.containsKey(sum - k)) {
                // actually get the i - 1 index for  map.get(sum - k)
                res = Math.min(res, i - map.get(sum - k));
            }
            map.put(sum, i);
        }
        return res == Integer.MAX_VALUE ? -1 : res;
    }
}

 

[LintCode] 1844. subarray sum equals k II

标签:render   map   put   output   sub   ash   actual   new   +=   

原文地址:https://www.cnblogs.com/xuanlu/p/12515155.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!