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检测硬盘读取速度
1. 清空缓存 > /proc/sys/vm/drop_caches 2. 测试读取速度 a. 将/dev/zero中数据按1M的数据单位写入testfile,共写512个单位,并不通过缓存 c ...
- Activity与Service的回收
Android开发中,一个Application,运行在一个进程中.这个Application的各种组件(四种组件),通常是运行在同一个进程中的.但是,并不是绝对的.由于某种需求,比如,你可以设置Ap ...
- 【BZOJ】1705: [Usaco2007 Nov]Telephone Wire 架设电话线
[题意]给定一排n根杆高度hi,一个常数C,杆升高x的代价为x^2,相邻两杆之间架设电话线代价为高度差*C,求总代价最小. [算法]DP+辅助数组优化 [题解]令f[i][j]表示第i根杆高度为j的最 ...
- auto-keras 测试保存导入模型
# coding:utf-8 import time import matplotlib.pyplot as plt from autokeras import ImageClassifier# 保存 ...
- HDU 2199 二分
我们可以发现这个函数是单增的,那么这样二分就好了. 反思:刚转C++,不会用scanf读入实数.(scanf("%lf",&y)) //By BLADEVIL #inclu ...
- bzoj 1014 splay
首先我们可以用splay来维护这个字符串,那么对于某两个位置的lcp,维护每个节点的子树的hash,然后二分判断就好了. /************************************** ...
- postman测试express restful接口
安装express及postman var express = require('express') var app = express(); var calculation = require('. ...
- ssh日常优化使用
config文件的使用 ssh命令默认会加载 ~/.ssh/config 文件作为配置文件,如果没有则采用默认配置.如果我们想要对ssh进行定制,那么就可以使用如下方法 [root@linux-nod ...
- Django rest framework 权限操作(源码分析)
知识回顾http://www.cnblogs.com/ctztake/p/8419059.html 这一篇是基于上一篇写的,上一篇谢了认证的具体流程,看懂了上一篇这一篇才能看懂, 当用户访问是 首先执 ...
- 3.FireDAC组件快照
TFDManager 连接定义和Connect连接管理 TFDConnection 数据库连接组件,支持三种连接方式:1.持久定义(有一个唯一名称和一个配置文件,可以由FDManager管理) 例: ...