子数组之和
2015-11-30 22:32
190 查看
给定一个整数数组,找到和为零的子数组。你的代码应该返回满足要求的子数组的起始位置和结束位置
样例
给出[-3, 1, 2, -3, 4],返回[0, 2] 或者 [1, 3].
思路:这道题最开始我的想法是用两重宣传去查找第一组连续数字和为0的两端,会发现这种情况算法的复杂度是O(n*n);应该是挺复杂的方法;之后又看到了这样的算法,我们从第一个开始,把对于每一个元素而言的前n项和求出来,当出现sum(j)=sum(i)(j>i)时,即可认为第i+1项到第j项的总和为0;这是一个很巧妙的算法。所以我们建立一个前n项和的数组,并且进行一次排序即可得到结果。复杂程度为O(nlogn)
样例
给出[-3, 1, 2, -3, 4],返回[0, 2] 或者 [1, 3].
思路:这道题最开始我的想法是用两重宣传去查找第一组连续数字和为0的两端,会发现这种情况算法的复杂度是O(n*n);应该是挺复杂的方法;之后又看到了这样的算法,我们从第一个开始,把对于每一个元素而言的前n项和求出来,当出现sum(j)=sum(i)(j>i)时,即可认为第i+1项到第j项的总和为0;这是一个很巧妙的算法。所以我们建立一个前n项和的数组,并且进行一次排序即可得到结果。复杂程度为O(nlogn)
class Element implements Comparable<Element>{ int index; int value; public Element (int i,int v){ index = i; value = v; } public int compareTo(Element other){ return this.value-other.value; } public int getIndex(){ return index; } public int getValue(){ return value; } } public class Solution { /** * @param nums: A list of integers * @return: A list of integers includes the index of the first number * and the index of the last number */ public ArrayList<Integer> subarraySum(int[] nums) { // write your code here ArrayList<Integer> res = new ArrayList<Integer>(); if(nums == null || nums.length == 0) return res; int len = nums.length; Element[] sums = new Element[len+1]; sums[0]= new Element(-1,0); int sum =0; for(int i=0;i<len;i++){ sum += nums[i]; sums[i+1]= new Element(i,sum); } Arrays.sort(sums); for(int i=0;i<len;i++){ if(sums[i].getValue()==sums[i+1].getValue()){ int m = Math.min(sums[i].getIndex(),sums[i+1].getIndex())+1; int n = Math.max(sums[i].getIndex(),sums[i+1].getIndex()); res.add(m); res.add(n); return res; } } return res; } }
相关文章推荐
- Josephus问题解决方法二
- Android CustomShapeImageView对图片进行各种样式裁剪:圆形、星形、心形、花瓣形等
- MySQL 5.7非安装版压缩包无法启动服务的解决办法
- c++ 递归 8皇后
- Concurrency
- 关于学习
- 关于cell点击之后变换背景文字的颜色的cell.selectedTextColor这个属性可以用的
- 安装RabbitMQ(一)
- 第一次软件练习
- osx jni 开发 1
- NouveauParfum
- crc
- 汉诺塔
- C++ Tips and Tricks
- mysql5.6-独立undo log
- ATM
- js,jquery,css,html5特效
- 服务器新环境搭建笔记
- 大数操作类
- Java NIO和IO的主要区别