Lintcode: Subarray Sum
Given an integer array, find a subarray where the sum of numbers is zero. Your code should return the index of the first number and the index of the last number. Example Given [-3, 1, 2, -3, 4], return [0, 2] or [1, 3].
推荐解法:The idea is based on the prefix sum: Iterate through the array and for every element array【i】, calculate sum of elements form 0 to i (this can simply be done as sum += arr【i】). If the current sum has been seen before, then there is a zero sum array, the start and end index are returned.
用HashMap: O(N)时间,但是more memory, 大case会MLE
1 public class Solution { 2 /** 3 * @param nums: A list of integers 4 * @return: A list of integers includes the index of the first number 5 * and the index of the last number 6 */ 7 public ArrayList<Integer> subarraySum(int[] nums) { 8 // write your code here 9 ArrayList<Integer> res = new ArrayList<Integer>(); 10 if (nums==null || nums.length==0) return res; 11 HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(); 12 map.put(0, -1); 13 int sum = 0; 14 for (int i=0; i<nums.length; i++) { 15 sum += nums[i]; 16 if (!map.containsKey(sum)) { 17 map.put(sum, i); 18 } 19 else { 20 res.add(map.get(sum)+1); 21 res.add(i); 22 return res; 23 } 24 } 25 return res; 26 } 27 }
因为上面这个简洁的代码会MLE,所以(nlog(n))第二个算法,时间多一点,但是空间少一点
1 class Element implements Comparable<Element>{ 2 int index; 3 int value; 4 public Element(int i, int v){ 5 index = i; 6 value = v; 7 } 8 public int compareTo(Element other){ 9 return this.value-other.value; 10 } 11 public int getIndex(){ 12 return index; 13 } 14 public int getValue(){ 15 return value; 16 } 17 } 18 19 public class Solution { 20 /** 21 * @param nums: A list of integers 22 * @return: A list of integers includes the index of the first number 23 * and the index of the last number 24 */ 25 public ArrayList<Integer> subarraySum(int[] nums) { 26 ArrayList<Integer> res = new ArrayList<Integer>(); 27 if (nums==null || nums.length==0) return res; 28 int len = nums.length; 29 Element[] sums = new Element[len+1]; 30 sums[0] = new Element(-1,0); 31 int sum = 0; 32 for (int i=0;i<len;i++){ 33 sum += nums[i]; 34 sums[i+1] = new Element(i,sum); 35 } 36 Arrays.sort(sums); 37 for (int i=0;i<len;i++) 38 if (sums[i].getValue()==sums[i+1].getValue()){ 39 int start = Math.min(sums[i].getIndex(),sums[i+1].getIndex())+1; 40 int end = Math.max(sums[i].getIndex(),sums[i+1].getIndex()); 41 res.add(start); 42 res.add(end); 43 return res; 44 } 45 46 return res; 47 } 48 }
分类:
Lintcode
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架