Continuous Subarray Sum II

 

Given an circular integer array (the next element of the last element is the first element), find a continuous subarray in it, where the sum of numbers is the biggest. Your code should return the index of the first number and the index of the last number.

If duplicate answers exist, return any of them.

Example

Give [3, 1, -100, -3, 4], return [4,1].

先是一个超时了的代码。。虽然剪了枝但还是会超时。

Time Limit Exceeded 91% test cases passed. Total Runtime: 12957 ms

 public class Solution {
/**
* @param A an integer array
* @return A list of integers includes the index of the first number and the index of the last number
*/
public ArrayList<Integer> continuousSubarraySumII(int[] A) {
int l = A.length;
int s = 0;
int e = 0;
int ms = 0;
int me = 0;
int sum = A[0];
int max = A[0];
ArrayList<Integer> list = new ArrayList(); if(l == 1){
list.add(0);
list.add(0);
return list;
} for(int j = 0;j<l;j++) {
if(A[j] <= 0) continue;
sum = A[j];
s = j;
e = j;
for(int i = (j+1)%l;j!=i;i = (i+1)%l){
if(A[i] < 0) {
if(sum > max) {
max = sum;
ms = s;
me = e;
}
} if(sum < 0) {
sum = A[i];
s = i;
e = i;
}else {
sum += A[i];
e = i;
}
}
} if(max > sum) {
list.add(ms);
list.add(me);
}else {
list.add(s);
list.add(e);
}
return list;
}
}

然后很仔细的想了一下。设0<=a<=b<=A.length,最大和区间只有两种情况:[a,b]和[b,A.length-1]U[0,a];只要找出这两种情况下的最大区间和,比较一下大的那个就是所求区间。

第一种情况就是求不头尾相连数组A的最大和区间。第二种是求不头尾相连A的最小子区间[a+1,b-1](或者说是-A的最大区间和)。

敲出一段乱糟糟的代码终于AC了,容我去撸一把。

Accepted Total Runtime: 12746 ms 100% test cases passed.

 public class Solution {
/**
* @param A an integer array
* @return A list of integers includes the index of the first number and the index of the last number
*/
public ArrayList<Integer> continuousSubarraySumII(int[] A) {
int[] nums = A;
int sum = nums[0];
int allsum = nums[0];
int max = nums[0];
int min = nums[0];
int msum = nums[0];
int mins = 0;
int mine = 0;
int s1 = 0;
int e1 = 0;
int s = 0;
int e = 0;
int ms = 0;
int me = 0;
ArrayList<Integer> list = new ArrayList<Integer>(); for(int i = 1 ;i < nums.length ;i++) {
allsum += nums[i];
if(nums[i] < 0) {
if(sum > max) {
max = sum;
ms = s;
me = e;
}
} if(nums[i] > 0) {
if(msum < min) {
min = msum;
mins = s1;
mine = e1;
}
} if(sum < 0) {
sum = nums[i];
s = i;
e = i;
}else {
sum+=nums[i];
e++;
} if(msum > 0) {
msum = nums[i];
s1 = i;
e1 = i;
}else {
msum+=nums[i];
e1++;
}
} if(sum > max) {
max = sum;
ms = s;
me = e;
}
if(msum < min) {
min = msum;
mins = s1;
mine = e1;
}
int val = allsum - min;
if(val > max && (mins != 0 && mine != A.length-1)) {
ms = mine + 1;
me = mins - 1;
} list.add(ms);
list.add(me);
return list;
}
}

还有一个想法是将A拷贝一份接上,然后相当于求这整个数组的最大和区间。想法是设置一个int flag允许遍历数组尾部两次;同时限制区间长度不能超过A.length。但是WA了。快折腾一下午了实在不想搞了先放着以后想起来再说把。

Wrong Answer Total Runtime: 8168 ms 78% test cases passed.

 public class Solution {
/**
* @param A an integer array
* @return A list of integers includes the index of the first number and the index of the last number
*/
public ArrayList<Integer> continuousSubarraySumII(int[] A) {
int l = A.length;
int s = 0;
int e = 0;
int ms = 0;
int me = 0;
int sum = A[0];
int max = A[0];
int flag = 2;//允许遍历数组尾部2次
ArrayList<Integer> list = new ArrayList(); if(l == 1){
list.add(0);
list.add(0);
return list;
} int i = 1;
while(flag > 0) {
if(i == l - 1) flag--;
if(A[i] < 0) {
if(sum > max) {
max = sum;
ms = s;
me = e;
}
} if(sum < 0) {
sum = A[i];
s = i;
e = 0;
}else {
if(e + 1 > l - 1) break;
sum += A[i];
e++;
} i = (i + 1) % l;
} if(max > sum) {
list.add(ms);
list.add((me+ms)%l);
}else {
list.add(s);
list.add((e+s)%l);
}
return list;
}
}

Continuous Subarray Sum II(LintCode)的更多相关文章

  1. [LintCode] Continuous Subarray Sum II

    Given an integer array, find a continuous rotate subarray where the sum of numbers is the biggest. Y ...

  2. LeetCode:40. Combination Sum II(Medium)

    1. 原题链接 https://leetcode.com/problems/combination-sum-ii/description/ 2. 题目要求 给定一个整型数组candidates[ ]和 ...

  3. Continuous Subarray Sum II

    Description Given an circular integer array (the next element of the last element is the first eleme ...

  4. [LeetCode] Combination Sum II (递归)

    Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in ...

  5. LeetCode Path Sum II (DFS)

    题意: 给一棵二叉树,每个叶子到根的路径之和为sum的,将所有可能的路径装进vector返回. 思路: 节点的值可能为负的.这样子就必须到了叶节点才能判断,而不能中途进行剪枝. /** * Defin ...

  6. LeetCode Combination Sum II (DFS)

    题意: 在集合candidates中选出任意多个元素,使得他们的和为target,返回所有的组合,以升序排列. 思路: 难点在于如何去重,比如集合{1,1,2},target=3,那么只有一个组合就是 ...

  7. 【树】Path Sum II(递归)

    题目: Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the give ...

  8. Single Number II(LintCode)

    Single Number II Given 3*n + 1 numbers, every numbers occurs triple times except one, find it. Examp ...

  9. LintCode 402: Continuous Subarray Sum

    LintCode 402: Continuous Subarray Sum 题目描述 给定一个整数数组,请找出一个连续子数组,使得该子数组的和最大.输出答案时,请分别返回第一个数字和最后一个数字的下标 ...

随机推荐

  1. 洛谷 2957 [USACO09OCT]谷仓里的回声Barn Echoes

    题目描述 The cows enjoy mooing at the barn because their moos echo back, although sometimes not complete ...

  2. 51nod 1873 高精度计算

    JAVA BigDecimal import java.util.*; import java.math.*; public class Main { public static void main( ...

  3. 用Photoshop制作一寸照片

    好了简单介绍一下自己如何制作一寸照片.   工具/原料   Photoshop CS4 更高版本也可以 方法/步骤   1 打开你要修改的照片 2 选择裁剪工具设置参数   选择最佳位置裁剪   选择 ...

  4. python学习笔记(六)之操作符

    python中算术操作符: + - * / % ** // 注意: /:为真实除法,即对应数学中的除法,通常返回一个浮点数 //:取整除法,即取商 %:求模,即取余数 **:幂运算,这里需要注意的一点 ...

  5. Mayor's posters(线段树+离散化+区间染色)

    题目链接:http://poj.org/problem?id=2528 题目: 题意:将n个区间进行染色(对于同一个区间,后一次染色会覆盖上一次的染色),问最后可见的颜色有多少种. 思路:由于区间长度 ...

  6. python基础===一道小学奥数题的解法

    今早在博客园和大家分享了一道昨晚微博中看到的小学奥数题,后来有朋友给出了答案.然后我尝试用python解答它. 原题是这样的: 数学题:好事好 + 要做好 = 要做好事,求 “好.事.做.要”的值分别 ...

  7. (十七)vmware无法将网络更改为桥接状态

    故障现象,导致虚拟机无法正常上网 设备管理器中的驱动设备正常加载,但是注意这两个虚拟网卡是有问题的 将这两个虚拟网卡删除 只剩物理网卡了,重新启动电脑 将虚拟机里的网络设置删除 清空网卡后点击恢复默认 ...

  8. 64_l6

    lightdm-qt5-devel-1.22.0-1.fc26.i686.rpm 19-May-2017 11:11 22854 lightdm-qt5-devel-1.22.0-1.fc26.x86 ...

  9. libsensor

    https://github.com/easyiot-china/libsensor https://github.com/adafruit/DHT-sensor-library https://gi ...

  10. 【bzoj1072】SCOI2007排列

    状压dp,f[i][j]表示当前取了i,模数余j的状态. 然后向后推,枚举可能的数即可. 注意每个数存在重复,最后要除以相应出现次数的阶乘. #include<bits/stdc++.h> ...