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;
        }
    }
  • 相关阅读:
    TPS限流
    JDK并发基础与部分源码解读
    tomcat6-servlet规范对接 与 ClassLoader隔离
    tomcat6-输入输出buffer设计
    tomcat6-endpoint设计
    springMVC请求路径 与实际资源路径关系
    mysql 常用的数据类型
    认识IPv4分组
    CSMA/CD协议(载波侦听多路访问/碰撞检测) 最小帧长理解
    简单的vector--- 2
  • 原文地址:https://www.cnblogs.com/xuanlu/p/12515155.html
Copyright © 2011-2022 走看看