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;
        }
    }
  • 相关阅读:
    SpringBoot的多环境配置及配置文件位置
    SpringBoot;yaml配置, JSR303校验
    springboot原理探寻,自动装配
    SpringBoot入门:搭建SpringBoot
    Android控件阴影库
    Android开发Utils工具类集合
    Android 实现顶部状态栏的沉浸模式(任意设置状态栏的颜色)
    推荐一个博客代码高亮插件
    H5+Css+js 做App UI 与原生的区别
    Android线程切换简便方法
  • 原文地址:https://www.cnblogs.com/xuanlu/p/12515155.html
Copyright © 2011-2022 走看看