题目描述如下
花了一个多小时,还是没有AC,,
吐槽一下平台,,
明明要返回的是true 和 false,可是每次都说这两个东西没有定义,,,
好吧,感觉python对缩进的格式还是很苛刻的。
记录一下今天未成功的代码作为反思,在用for的时候完全没注意到数据规模如此庞大,,我还用了两个for,这不超出时间限制才怪呢。还有一个问题就是,对于for的使用不正确。
未AC的代码
class Solution(object):
def checkSubarraySum(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: bool
"""
length = len(nums)
if length < 2:
return 1&0==1
for i in range(0,length-1):
sum1 = nums[i]
for j in range(i + 1, length):
sum1 += nums[j]
if k == 0 and sum1 == 0:
return 1&0==0
if k != 0 and sum1 % k == 0:
return 1&0==0
if sum1==0 :
return 1&0==0
return 1&0==1
参考下其他大牛利用动态规划求解的思路,,,如何进行一个更新和记录是本题必须要考虑的问题。
class Solution {
int[] dp = new int[10010];
public boolean checkSubarraySum(int[] nums, int k) {
if(nums.length < 2) return false;
//k==0时单独考虑,其实和k!=0时只有做不做模运算的区别
if(k == 0){
for(int i = 0; i < nums.length; i++){
for(int j = 0; j < nums.length-i; j++){
dp[j] = (dp[j]+nums[j+i]);
if(i != 0 && dp[j] == 0) return true;
}
}
return false;
}
//当i=k时,dp[j]表示以j为起始下标,nums中连续k+1个整数的和
//如当i=0时,相当于将nums拷贝到dp
//i=1时,dp[0]相当于以0为起始下标,nums中2个整数的和,即nums[0]+nums[1]
//每次计算时都可以用原来的dp进行更新,而不用一个个去加
for(int i = 0; i < nums.length; i++){
for(int j = 0; j < nums.length-i; j++){
dp[j] = (dp[j]+nums[j+i]) % k;
if(i != 0 && dp[j] == 0) return true;
}
}
return false;
}
}
作者:Girapath
链接:https://leetcode-cn.com/problems/continuous-subarray-sum/solution/dong-tai-gui-hua-qiu-jie-lian-xu-zi-shu-zu-he-by-g/
明天找个时间再消化一下,,