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 题目描述 给定一个整数数组,请找出一个连续子数组,使得该子数组的和最大.输出答案时,请分别返回第一个数字和最后一个数字的下标 ...
随机推荐
- [洛谷P4768] [NOI2018]归程 (kruskal重构树模板讲解)
洛谷题目链接:[NOI2018]归程 因为题面复制过来有点炸格式,所以要看题目就点一下链接吧\(qwq\) 题意: 在一张无向图上,每一条边都有一个长度和海拔高度,小\(Y\)的家在\(1\)节点,并 ...
- [Luogu 4092] HEOI/TJOI2016 树
[Luogu 4092] HEOI/TJOI2016 树 搜了树剖标签不知道怎么就跳出了个暴搜题啊! 管他既然做了就发上来吧- 有修改标签就向下搜并修改,遇到标签即停止. 这题是真的真的短. #inc ...
- Spark的Shuffle过程介绍
Spark的Shuffle过程介绍 Shuffle Writer Spark丰富了任务类型,有些任务之间数据流转不需要通过Shuffle,但是有些任务之间还是需要通过Shuffle来传递数据,比如wi ...
- debussy与modelsim的联调设置
前段时间看到网上有人在使用debussy软件对Verilog代码进行调试,而且都称赞其是多么的好用,看着很是馋人,说吧,现在用的是quartus与modelsim的联调,似乎还是可以的,但就是每次稍微 ...
- 【vijos】P1659 河蟹王国
[算法]线段树 [题解]区间加上同一个数+区间查询最大值.注意和谐值可以是负数,初始化ans为负无穷大. #include<cstdio> #include<algorithm> ...
- 前端&后端程序员必备的Linux基础知识
一 从认识操作系统开始 1.1 操作系统简介 我通过以下四点介绍什么操作系统: 操作系统(Operation System,简称OS)是管理计算机硬件与软件资源的程序,是计算机系统的内核与基石: 操作 ...
- linux===启动sdk manager下载配置sdk的时候报错的解决办法
当启动sdk manager下载配置sdk的时候,报错如下: botoo@botoo-virtual-machine:/opt/android-sdk-linux/tools$ sudo ./and ...
- 64_m2
mimetic-devel-0.9.8-7.fc26.i686.rpm 12-Feb-2017 05:40 288474 mimetic-devel-0.9.8-7.fc26.x86_64.rpm 1 ...
- 【bzoj1798】【AHOI2009】维护序列
练一下线段树模板,区间乘法. #include<bits/stdc++.h> #define lson (o<<1) #define rson (o<<1|1) ; ...
- 深度解析Python动态语言
1.动态语言的定义 动态编程语言是高级程序设计语言的一个类别,在计算机科学领域已被广泛应用.它是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删除或是其他结 ...