139 - Subarray Sum II
Written on October 21, 2015
Tweet
Given an integer array, find a subarray where the sum of numbers is between two given interval. Your code should return the number of possible answer.
public class Solution {
public int subarraySumII(int[] nums, int start, int end) {
if (nums == null || nums.length == 0 || start > end) return 0;
int[] sum = new int[nums.length];
sum[0] = nums[0];
for (int i = 1; i < nums.length; i++) {
sum[i] = sum[i - 1] + nums[i];
}
Arrays.sort(sum);
int count = 0;
for (int i = 0; i < sum.length; i++) {
if (sum[i] >= start && sum[i] <= end) {
count ++;
}
int left = sum[i] - end, right = sum[i] - start;
// start <= sum[i] - sum[j] <= end
// sum[i] - end <= sum[j] <= sum[i] - start;
//找到满足这个条件的sum[j]的个数
//找到左边比right大的最小数的index和右边比left小的最大数的index
count += find(sum, right + 1) - find(sum, left);
}
return count;
}
public int find(int[] sum, int val) {
int lo = 0, hi = sum.length - 1;
while (lo <= hi) {
int mid = lo + (hi - lo) / 2;
if (val == sum[mid]) {
return mid;
} else if (val < sum[mid]) {
hi = mid - 1;
} else {
lo = mid + 1;
}
}
return lo;
}
}
public class Solution {
/**
* @param A an integer array
* @param start an integer
* @param end an integer
* @return the number of possible answer
*/
public int subarraySumII(int[] A, int start, int end) {
// Write your code here
if (A == null) return -1;
int count = 0;
int[] sums = new int[A.length + 1];
for (int i = 1; i <= A.length; i++) {
sums[i] = sums[i-1] + A[i-1];
}//这种问题都A.length + 1,必须考虑A[0]也可能满足条件
//Arrays.sort(sums); no need to sort, we are trying every i, j
for (int i = 0; i <= A.length; i++) {
for (int j = i; j <= A.length; j++) {
if (sums[j] - sums[i] >= start && sums[j] - sums[i] <= end){
count ++;
}
}
}
return count;
}
}