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;
        }
    }
  • 相关阅读:
    phpexcel Could not open for reading! File does not exist.
    tp5 微信JSAPI支付
    ajax返回数据不跳success
    tp5 paginate带参翻页
    php 小程序 前后端POST通信
    小程序页面跳转不同方法
    小程序添加购物车
    小程序商城数量加减效果
    Include conf/extra/httpd-ssl.conf apache 无法启动
    SQL 实验详细源码参考
  • 原文地址:https://www.cnblogs.com/xuanlu/p/12515155.html
Copyright © 2011-2022 走看看