1、未考虑的情况:
k=0的情况,一般涉及到%和/都要优先考虑到除数为0的情况。
k=0且数组中有连续两个0的情况,返回true
双层循环,复杂度(O(n^2))
代码:
package com.leetCode.dp;
public class leet523 {
/**
* 修改1:k=0的情况,会出现%k除数为0的错误
* 修改2:在1的基础上k=0直接返回false是不行的,如果数组中有连续的两个0,结果应该是true
* @param args
*/
public static void main(String[] args) {
int[] nums = {0,1,0};
System.out.println(checkSubarraySum(nums,0));
}
public static boolean checkSubarraySum(int[] nums, int k) {
boolean flag = false;
for(int i=0;i<nums.length-1;i++)
{
int now=nums[i];
for(int j=i+1;j<nums.length;j++)
{
now+=nums[j];
if(k==0&&now==0) return true;
if(k==0) continue;
if(now%k==0) return true;
}
}
return flag;
}
}
2、题解中优化做法
主要思想:
A、两个不同的前缀和的余数相等,意味着这两个前缀和之差就是k的倍数
B、sum=sum%k对求解前缀和的余数没有影响,他只是让sum和余数之间的差去掉,但为什么这样子
做呢,有两个好处
a.加入①,碰到[1,0,1] k=2这种nums[i]都小于k的,sumk的,处理框架依然在A的范围内
b.碰到k0时,处理框架也依然在A的范围
使用HashMap记录,到第i个数据,前i个数据和%k的值
代码:
public class Solution {
public boolean checkSubarraySum(int[] nums, int k) {
int sum = 0;
HashMap < Integer, Integer > map = new HashMap < > ();
map.put(0, -1);
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
if (k != 0)
sum = sum % k;
if (map.containsKey(sum)) {
if (i - map.get(sum) > 1)
return true;
} else
map.put(sum, i);
}
return false;
}
}
作者:LeetCode
链接:https://leetcode-cn.com/problems/continuous-subarray-sum/solution/lian-xu-de-zi-shu-zu-he-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:guanzhanyi
链接:https://leetcode-cn.com/problems/continuous-subarray-sum/solution/guan-fang-di-san-ge-ti-jie-hashmapde-li-jie-he-xia/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。