问道简单的Leetcode的题: #53 Maximum Subarray

s
suiji
楼主 (北美华人网)
我用的brute force,非最优解,通不过。204/209 cases passed,反馈只给了正确答案,好像是数列比较长,数比较大的时候不对。但我不知道哪里错了。大牛们帮看看,指点一下吧 题目:Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum. A subarray is a contiguous part of an array. Example 1: Input: nums = [-2,1,-3,4,-1,2,1,-5,4] Output: 6 Explanation: [4,-1,2,1] has the largest sum = 6.

class Solution {     public int maxSubArray(int[] nums) {         int largest = Integer.MIN_VALUE;         if (nums.length == 0) {             return largest;         }         if (nums.length == 1) {             return nums[0];         }         for (int i = 0; i < nums.length; i++) {             int sum = 0;             for (int j = i; j < nums.length; j++) {                 sum += nums[j];                 largest = Math.max(sum, largest);             }                     }         return largest;     } }
w
wfmlover
这个论坛都已经可以用来问leetcode题目了啊……


s
suiji
这里大牛多,期望有哪位拨冗指点一下
s
sportcar
这个论坛都已经可以用来问leetcode题目了啊……



wfmlover 发表于 2022-01-10 14:36

好啊 新年新气象
c
coalpilerd
算法本身倒是看不出问题,但是你说数列长数字大的时候有问题,是因为没考虑overflow的情况吧?
W
WaveletLiu
会不会是数列太长超时了啊?这题复杂度线性就行了, 不需要平方的。
纷纷大土豆
这loop两圈直接就N平方了,肯定不行啊
直接看答案吧,这个估计要DP
i
iheartnyc
Brute force 是 n**3, 肯定会time out啊
城主的眼罩
O(n*n)会TLE吧,找个线性解
大内密探008 发表于 2022-01-10 14:43

嗯,就是基本上不要搞两个for loop
w
wfmlover
这里大牛多,期望有哪位拨冗指点一下
suiji 发表于 2022-01-10 14:39

这题是基本的DP课后题啊
W
WaveletLiu
算法本身倒是看不出问题,但是你说数列长数字大的时候有问题,是因为没考虑overflow的情况吧?
coalpilerd 发表于 2022-01-10 14:43

如果没报超时, 只是报错, 那确实有可能是overflow。你那个sum在变负的时候, 不能一直负下去, 必须要清成0的。看答案吧。
C
CleverBeaver
嗯,就是基本上不要搞两个for loop
城主的眼罩 发表于 2022-01-10 14:47

对头
C
CleverBeaver
space time tradeoff
好几年没刷的飘过
f
flyingforce
标准的DP题目,从左到右dp = max(dp[i-1] + num, num), 然后取出max(dp) 就行了
g
gokgs
这题标准答案 linear 阿。面试碰到这题基本是送分阿。跟问 1+1 等于几差不多。
m
marytng
天天琢磨这些破题,好好的正常人都变成了索男索女 真希望下一代别做这行。
落叶纷飞
Brute force 算法没问题,就是超时了。比较简单好理解的的一个办法,一个loop, 累加的和为负数后,换成当前数字,继续累加并存下当前累加和的最大值
s
suiji
谢谢大家,挺有启发。我只是想自己先用笨方法试试,看来估计是time out了。还没学过DP,上面有提到的解法好像叫Kadane's algorithm,确实O(n)就可以。
千渔千寻
回复 1楼suiji的帖子
203 / 209 test cases passed. Status: Time Limit Exceeded
h
h2o.work
竟然卷到这里了
w
wdmn
动态规划,找出元素i为止的数组里的1.最大的subarray的和,2.以元素i为结尾的最大的和
int findMaxSubarray(vector<int> array) { int currMax = array[0]; int currTailMax = array[0]; for (int i = 1; i < array.size(); i++) { if (array[ i ] > currTailMax) { currTailMax = array[ i ]; } else { currTailMax += array[ i ]; } if(currTailMax > currMax) { currMax = currTailMax; } } return currMax; }
s
suiji
回复 1楼suiji的帖子
203 / 209 test cases passed. Status: Time Limit Exceeded
千渔千寻 发表于 2022-01-10 15:10

谢谢,我是在VSCode里面直接提交的,没去Leetcode网站,没有看到超时的信息。下次再到网站提交试试
裴夫人
华人什么时候开程序媛专版(认真脸,感觉是有这个需求)
s
suiji
开吧,我没有地里的账号,看来需要搞一个,那边有这么高的人气吗?问这种傻傻的问题,会有高手指点吗? 再次谢谢各位
n
neutra
刷题的人是不知道leet code上本身有论坛么?还是不知道一亩三分地?
刷题是为了练习学到的算法知识和解题技巧。这个楼主DP还没弄明白,为啥要把时间花在naive解上?浪费时间!还跑到华人上来问,好玩儿么?
s
suiji
初学者,还请海涵。菜鸟,没有别的途径,只好在这里问。
z
zilliondollar
赞,闲话版的一股清流
h
hellosmallworld
Leetcode网站的discussion区看大神们答案呀,再看不懂Google直接搜题号,为啥会想到来华人问。。。
l
lishu2
Brute force 算法没问题,就是超时了。比较简单好理解的的一个办法,一个loop, 累加的和为负数后,换成当前数字,继续累加并存下当前累加和的最大值
落叶纷飞 发表于 2022-01-10 15:02


for (int i = 1; i < n; i++) { currentSum = Math.max(currentSum + array[ i ], array[ i ]); maxSubSum = Math.max(maxSubSum, currentSum); }
array [ i ] 发不出来
n
neutra
初学者,还请海涵。菜鸟,没有别的途径,只好在这里问。
suiji 发表于 2022-01-10 15:29

我的答案是请不要把时间浪费在写naive的解和弄清naive的解过不了上面。请把时间用来学习正确的高效的解法。
把正确高效的解法套路积累到一定程度之后,再开始想办法自己解题。
你这样搞好比只学了加法却要计算乘法,99表都没背清楚,算个8x8也只能把8个8拿来手动相加。有意义么?
n
neutra
如果一定要弄清自己的低效解法为什么过不了,请在自己电脑上装个编程软件自己debug.
C
Cloudy20
天呐,看了头晕。。没力气刷题,工资少就少点吧,反正我花销也不高
h
heydaymint
那几个testcase应该是input太大超时了