题目
失败代码
public static int CalSumNum(int[] num) {
int sum=0;
for(int i=0;i<num.length;i++) {
sum+=num[i];
}
return sum;
}
public static boolean checkSubarraySum(int[] nums, int k) {
if(nums.length<2) return false;
if(nums.length==2) {
if((nums[0]+nums[1]) % k==0) return true;
return false;
}
for(int i=2;i<=nums.length;i++) {
for(int j=0;j<=nums.length-i;j++) {
int[] temp = new int[i];
temp = Arrays.copyOfRange(nums,j,i+j);
if(CalSumNum(temp) % k==0) return true;
}
}
return false;
}
public static boolean checkSubarraySum(int[] nums, int k) {
if(nums.length<2) return false;
if(nums.length==2) {
if((nums[0]+nums[1]) % k==0) return true;
return false;
}
int[] pre = new int[nums.length];
pre[0] = nums[0];
for(int i=1;i<nums.length;i++) {
pre[i] = pre[i-1]+nums[i];
}
for(int i=1;i<=nums.length;i++) {
for(int j=0;j<nums.length-i;j++) {
if(j==0 && pre[i+j] % k==0) return true;
if(j!=0 && (pre[i+j]-pre[j-1])%k==0) return true;
}
}
return false;
}
思路
- 前缀和,有想过这个思路但是想了想后感觉行不通就放弃了,果然还是敏感度不够
- 写了一版前缀和,还是93/94,再滚过去看题解
- 哈希存储
- 哈希表的key:用来储存当前前缀和的余数 哈希表的value:则储存对应的index
代码
public static boolean checkSubarraySum(int[] nums, int k) {
if(nums.length<2) return false;
if(nums.length==2) {
if((nums[0]+nums[1]) % k==0) return true;
return false;
}
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
map.put(0, -1);
int rem=0;
for(int i=0;i<nums.length;++i) {
rem = (rem+nums[i])%k;
if(map.containsKey(rem)) {
int pos = map.get(rem);
if((i-pos)>=2) return true;
}
else map.put(rem, i);
}
return false;
}