标签:map 前缀 int res sum LintCode equals 数组
Given an array of integers and an integer k, you need to find the minimum size of continuous no-empty subarrays whose sum equals to k, and return its length.
if there are no such subarray, return -1.
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
子数组和为K II。
给定一个整数数组和一个整数k,你需要找到和为k的最短非空子数组,并返回它的长度。
如果没有这样的子数组,返回-1.
这道题的思路是前缀和。一般找一个符合题意的子数组,前缀和会是一个比较好用的思路。这里我们创建一个 hashmap,记录的是<数组的前缀和, 当前 index>,也就是说我们记录每一个 unique 的前缀和以及出现这个前缀和的位置。当我们遇到一个前缀和 = sum - k,同时这个前缀和存在于 hashmap 的时候,我们就找到了一个数组和为 K 的子数组。我们不断去找这样的子数组,返回最短的长度。
时间O(n)
空间O(n)
Java实现
1 public class Solution { 2 public int subarraySumEqualsKII(int[] nums, int k) { 3 // write your code here 4 int len = nums.length; 5 HashMap<Integer, Integer> map = new HashMap<>(); 6 map.put(0, -1); 7 int sum = 0; 8 int res = Integer.MAX_VALUE; 9 for (int i = 0; i < len; i++) { 10 sum += nums[i]; 11 if (map.containsKey(sum - k)) { 12 res = Math.min(res, i - map.get(sum - k)); 13 } 14 map.put(sum, i); 15 } 16 return res == Integer.MAX_VALUE ? -1 : res; 17 } 18 }
标签:map,前缀,int,res,sum,LintCode,equals,数组 来源: https://www.cnblogs.com/cnoodle/p/16403854.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。