Continuous Subarray Sum II(LintCode)
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.
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)的更多相关文章
- [LintCode] Continuous Subarray Sum II
Given an integer array, find a continuous rotate subarray where the sum of numbers is the biggest. Y ...
- LeetCode:40. Combination Sum II(Medium)
1. 原题链接 https://leetcode.com/problems/combination-sum-ii/description/ 2. 题目要求 给定一个整型数组candidates[ ]和 ...
- Continuous Subarray Sum II
Description Given an circular integer array (the next element of the last element is the first eleme ...
- [LeetCode] Combination Sum II (递归)
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in ...
- LeetCode Path Sum II (DFS)
题意: 给一棵二叉树,每个叶子到根的路径之和为sum的,将所有可能的路径装进vector返回. 思路: 节点的值可能为负的.这样子就必须到了叶节点才能判断,而不能中途进行剪枝. /** * Defin ...
- LeetCode Combination Sum II (DFS)
题意: 在集合candidates中选出任意多个元素,使得他们的和为target,返回所有的组合,以升序排列. 思路: 难点在于如何去重,比如集合{1,1,2},target=3,那么只有一个组合就是 ...
- 【树】Path Sum II(递归)
题目: Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the give ...
- Single Number II(LintCode)
Single Number II Given 3*n + 1 numbers, every numbers occurs triple times except one, find it. Examp ...
- LintCode 402: Continuous Subarray Sum
LintCode 402: Continuous Subarray Sum 题目描述 给定一个整数数组,请找出一个连续子数组,使得该子数组的和最大.输出答案时,请分别返回第一个数字和最后一个数字的下标 ...
随机推荐
- linux sh脚本异常:/bin/sh^M:bad interpreter: No such file or directory
在Linux中执行.sh脚本,异常/bin/sh^M: bad interpreter: No such file or directory.这是不同系统编码格式引起的:在windows系统中编辑的. ...
- Jumpserver代码规范
Jumpserver 项目规范(Draft) 语言框架 Python 3.6.1 (当前最新) Django 1.11 (当前最新) Flask 0.12 Luna (当前最新) Paramiko 2 ...
- 从零开始开发一款app,所想到的
我在知乎上看到这个问题http://www.zhihu.com/question/27645587.我在阅读了各位大牛的答案后,再加上自己的思考,就有了这篇文章的内容. 从零开始开发一款app ...
- Android通知栏介绍与适配总结
由于历史原因,Android在发布之初对通知栏Notification的设计相当简单,而如今面对各式各样的通知栏玩法,谷歌也不得不对其进行更新迭代调整,增加新功能的同时,也在不断地改变样式,试图迎合更 ...
- PHP is_null,empty以及isset,unset的区别
1.empty 判断一个变量是否为“空”.null.false.00.0.’0′.』.为以上值的变量在检测時都将返回true. 2.isset 判断一个变量是否已经设置.0.00.’0′.』.’ ‘. ...
- python学习笔记(九)之字符串
定义字符串 >>> mystring = 'Hello Python' >>> name = str('Mountain') >>> mystri ...
- php中比较好用的函数
PHP中一个好用的函数parse_url,特别方便用来做信息抓取的分析,举例子如下: $url = "http://www.electrictoolbox.com/php-extract-d ...
- HDU 1070 Milk (模拟)
题目链接 Problem Description Ignatius drinks milk everyday, now he is in the supermarket and he wants to ...
- hdu 1598 find the most comfortable road (并查集+枚举)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1598 find the most comfortable road Time Limit: 1000/ ...
- Eureka服务下线(Cancel)源码分析
Cancel(服务下线) 在Service Provider服务shut down的时候,需要及时通知Eureka Server把自己剔除,从而避免其它客户端调用已经下线的服务,导致服务不可用. co ...