lintcode:子数组之和为0
题目:
给定一个整数数组,找到和为零的子数组。你的代码应该返回满足要求的子数组的起始位置和结束位置
给出[-3, 1, 2, -3, 4],返回[0, 2] 或者 [1, 3].
解题:
更新
子树的和是0,根据给的例子:[-3, 1, 2, -3, 4],其累加和【-3,-2,0,-3,1】中心出现了一个数0 ,同时发现两个-3,第一个-3开始到第二个-3之前的部分就是这个子数组
数组【1,2,3,-5,3】,其累加和【1,3,6,1,5】,两个1之间的部分就是答案,根据元素数组:不包括第一个1的位置,包括第二个1的位置
所以:计算累加和,当和的值之前已经出现了,这个区间内的数就是子数组的起始id
注意:当包括0位置的时候,包括0位置,不包括最后一个位置
当不包括0位置的时候,包括上一个数位置,不包括当前位置
这个时候需要加入一个值防止是第一个数,put(0,-1),表示还没有数的时候数是0,起始位置是-1,这样当包括0位置的情况,转化为不包括0的情况
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> result = new ArrayList<Integer>();
if(nums == null || nums.length == 0){
return result;
}
HashMap<Integer,int[]> map = new HashMap<Integer,int[]>();
map.put(0,new int[]{-1});// 第一个元素为 0 id 应该为-1
int sum = 0;
for(int i=0;i<nums.length;i++){
sum += nums[i];
int[] value = map.get(sum);
if( value == null){
value = new int[]{i};
map.put(sum,value);
}else{
result.add(value[0] + 1);
result.add(i);
return result;
}
}
return result;
}
}
纯暴力,时间超时
Java程序:
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> result = new ArrayList<Integer>();
for(int i=0;i<nums.length;i++){
if(nums[i]==0){
result.add(i);
result.add(i);
return result;
}
for(int j=i+1;j<nums.length;j++){
int sum = 0;
for(int k = i;k<=j;k++){
sum+=nums[k];
}
if(sum==0){
result.add(i);
result.add(j);
return result;
}
}
}
return result;
}
}
时间复杂度:O(n3)
参考编程之美,时间复杂度降为:O(n2),这个转换其实很简单,但是有可能你就不知道
Java程序:
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> result = new ArrayList<Integer>();
for(int i=0;i<nums.length;i++){
if(nums[i]==0){
result.add(i);
result.add(i);
return result;
}
int sum = 0;
for(int j=i;j<nums.length;j++){
sum+=nums[j];
if(sum==0){
result.add(i);
result.add(j);
return result;
}
}
}
return result;
}
}
总耗时: 4127 ms
转化成Python程序:
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
"""
def subarraySum(self, nums):
# write your code here
numslen = len(nums)
for i in range(numslen):
sum = 0
for j in range(i,numslen):
sum+=nums[j]
if sum==0:
return [i,j]
总耗时: 974 ms
时间复杂度,也可以降到O(n)
这里利用到HashMap,从nums[0] 到nums[nums.length-1]的和,都添加到HashMap中,在这个求和的过程中回出现下面情况:
sum0->i = sum0->j
这里就说明sum(i+1)->j的和是0
这样时间复杂度就是O(n)
Java程序:
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
int numslen = nums.length;
ArrayList<Integer> result = new ArrayList<Integer>();
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
map.put(0,-1);
int sum = 0;
for(int i=0;i<numslen;i++){
sum+=nums[i];
if(map.containsKey(sum)){
result.add(map.get(sum) + 1);
result.add(i);
return result;
}
map.put(sum,i);
}
return result;
}
}
总耗时: 4520 ms
Python程序:
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
"""
def subarraySum(self, nums):
# write your code here
numslen = len(nums)
d = {0:-1}
sum = 0
for i in range(numslen):
sum = sum + nums[i]
if sum in d:
return [d.get(sum) + 1,i]
d[sum] = i
总耗时: 1361 ms
lintcode:子数组之和为0的更多相关文章
- [LeetCode] Minimum Size Subarray Sum 最短子数组之和
Given an array of n positive integers and a positive integer s, find the minimal length of a subarra ...
- Minimum Size Subarray Sum 最短子数组之和
题意 Given an array of n positive integers and a positive integer s, find the minimal length of a suba ...
- [LeetCode] 209. Minimum Size Subarray Sum 最短子数组之和
Given an array of n positive integers and a positive integer s, find the minimal length of a contigu ...
- [LeetCode] 930. Binary Subarrays With Sum 二元子数组之和
In an array A of 0s and 1s, how many non-empty subarrays have sum S? Example 1: Input: A = [1,0,1,0, ...
- 求数组的子数组之和的最大值III(循环数组)
新的要求:一维数组改成循环数组,只是涉及简单算法,只是拿了小数做测试 想法:从文件读取数组,然后新建数组,将文件读取的数组在新数组中做一下连接,成为二倍长度的数组,然后再遍历,将每次遍历的子数组的和存 ...
- 求数组的子数组之和的最大值II
这次在求数组的子数组之和的最大值的条件下又增加了新的约束: 1.要求数组从文件读取. 2.如果输入的数组很大, 并且有很多大的数字, 就会产生比较大的结果 (考虑一下数的溢出), 请保 ...
- [LintCode] Continuous Subarray Sum 连续子数组之和
Given an integer array, find a continuous subarray where the sum of numbers is the biggest. Your cod ...
- lintcode :continuous subarray sum 连续子数组之和
题目 连续子数组求和 给定一个整数数组,请找出一个连续子数组,使得该子数组的和最大.输出答案时,请分别返回第一个数字和最后一个数字的值.(如果两个相同的答案,请返回其中任意一个) 样例 给定 [-3, ...
- C#中求数组的子数组之和的最大值
<编程之美>183页,问题2.14——求子数组的字数组之和的最大值.(整数数组) 我开始以为可以从数组中随意抽调元素组成子数组,于是就有了一种想法,把最大的元素抽出来,判断是大于0还是小于 ...
随机推荐
- net 中捕获摄像头视频的方式及对比(How to Capture Camera Video via .Net) (转)
作者:王先荣前言 随着Windows操作系统的不断演变,用于捕获视频的API接口也在进化,微软提供了VFW.DirectShow和MediaFoundation这 三代接口.其中VFW早已被Di ...
- 身处IT的你对身边人都有哪些影响
前不久,跟外甥一起吃饭:他明年就要中考了,我就想,这马上就到人生的关键路口了,看他自己对将来有什么想法没:就问了句:勇勇,你以后想学习哪些方面的东西或者想从事什么工作呢?他简单的说了句:我要跟你一样学 ...
- Oracle中Left join的on和where的效率差别
假设有两个表a.b 使用on Select * from a left join b on b.col = a.col and b.col2 = ‘aa’ 使用 where Select * from ...
- CENTOS6.2系统日志rsyslog替换默认的日志服务syslog 转载自http://www.phpboy.net/linux/648.html
最近遇到配置centos 6.2的sshd及sftp日志,发现/etc/syslog.conf文件不存在, 然后: #rpm -qa | grep syslog 出来的是 rsyslog-5.8.10 ...
- php随机验证码
今天同学问我,用php怎么写验证码,由于是新手所以花了半天的时间才完成.而且功能很是简单呵呵.今天本来打算写session和cookie的看来是要明天了. <?php $image_width= ...
- (转)可收缩、扩展的TextView
在一些应用中,比如腾讯的应用市场APP应用宝,关于某款应用的介绍文字,如果介绍文字过长,那么不是全部展现出来,而是显示三四行的开始部分(摘要),预知全部的内容,用户点击展开按钮即可查阅全部内容.这样的 ...
- 左右滑动删除ListView条目Item--第三方开源--SwipeToDismiss
Android的SwipeToDismiss是github上一个第三方开源框架(github上的项目链接地址:https://github.com/romannurik/Android-SwipeTo ...
- 【面试虐菜】—— Apache知识整理
Apache性能调优1 Apache 部分:1. 移除不用的模块.2. 使用 mod_disk_cache NOT mod_mem_cache .3. 扁平架构配置mod_disk_cache.4. ...
- [转]system函数返回值探究
对于system这个函数的功能早就有一定了解,读书期间,就学习了UNIX系统编程这本书,后来买了APUE.我这个人总是有好读书不求甚解的毛病.对于system函数只知其一,不知其二.后来被人问起相关的 ...
- tomcat中server.xml文件解析
下面我们将讲述这个文件中的基本配置信息,更具体的配置信息见tomcat的文档 元素名 属性 解释 server port 指定一个端口,这个端口负责监听关闭tomcat的请求 shutdown 指定向 ...