zoukankan      html  css  js  c++  java
  • [LintCode] 1844. subarray sum equals k II

    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;
        }
    }
  • 相关阅读:
    Linux下设置svn开机自启动
    LNMP 如何安装mongodb ----lnmp一键安装包之后
    MySQL表类型MyISAM/InnoDB的区别(解决事务不回滚的问题)
    PHP处理MySQL事务代码
    php redis 秒杀demo
    PHP5.6版本安装redis扩展
    Jzoj5662 尺树寸泓
    Jzoj3351 神牛养成计划2
    Jzoj5622 table
    Jzoj5608 Subset
  • 原文地址:https://www.cnblogs.com/xuanlu/p/12515155.html
Copyright © 2011-2022 走看看