滑动窗口求数组中子串和等于K的最长子串的长度

81 阅读2分钟
  • 数组中子串和等于k的最长子串的长度是多少
  • 数组中全是正数
  • javascript
// 数组中子串和等于k的最长子串的长度是多少
function getMaxLength(arr, K) {
  if(arr == null || arr.length == 0 || K<=0) {
    return 0
  }
  let left = 0
  let right = 0
  let sum = arr[0]
  let len = 0
  while(right < arr.length) {
    if(sum == K) {
      let = Math.max(len, right - left + 1)
      sum -= arr[left++]
    }else if(sum < K) {
      right++
      if(right == arr.length) {
        break
      }
      sum += arr[right]
    }else {
      sum -= arr[left++]
    }
  }
  return len
}
//for test 暴力
function getMaxLength2(arr, K) {
  let max = 0
  for(let i = 0; i < arr.length; i++) {
    for(let j = i; j < arr.length; j++) {
      if(valid(arr,i,j,K)){
        max = Math.max(max, j - i + 1)
      }
    }
  }
  return max
}
function valid(arr,l,r,K){
  let sum = 0
  for(let i = l; i <= r; i++) {
    sum += arr[i]
  }
  return sum == K
}

function generatePositiveArray(size,value) {
  let ans = []
  for(let i = 0; i < size; i++) {
    ans[i] = (Math.random() * value) + 1
  }
  return ans
}
// 测试
function main() {
  let len = 50
  let value = 100
  let testTime = 1500
  let text = '成功'
  for(let i = 0; i < testTime; i++){
    let arr = generatePositiveArray(len, value)
    let K = Math.random() * value + 1
    let ans1 = getMaxLength(arr, K)
    let ans2 = getMaxLength2(arr,K)
    if(ans1 != ans2) {
      console.log('失败')
      text = '失败'
      break
    }
  }
  console.log(text)
}
main()
  • java
package class02;
public class Code01_LongestSumSubArrayLengthInPositiveArray {

	public static int getMaxLength(int[] arr, int K) {
		if (arr == null || arr.length == 0 || K <= 0) {
			return 0;
		}
		int left = 0;
		int right = 0;
		int sum = arr[0];
		int len = 0;
		while (right < arr.length) {
			if (sum == K) {
				len = Math.max(len, right - left + 1);
				sum -= arr[left++];
			} else if (sum < K) {
				right++;
				if (right == arr.length) {
					break;
				}
				sum += arr[right];
			} else {
				sum -= arr[left++];
			}
		}
		return len;
	}

	// for test
	public static int right(int[] arr, int K) {
		int max = 0;
		for (int i = 0; i < arr.length; i++) {
			for (int j = i; j < arr.length; j++) {
				if (valid(arr, i, j, K)) {
					max = Math.max(max, j - i + 1);
				}
			}
		}
		return max;
	}

	// for test
	public static boolean valid(int[] arr, int L, int R, int K) {
		int sum = 0;
		for (int i = L; i <= R; i++) {
			sum += arr[i];
		}
		return sum == K;
	}

	// for test
	public static int[] generatePositiveArray(int size, int value) {
		int[] ans = new int[size];
		for (int i = 0; i != size; i++) {
			ans[i] = (int) (Math.random() * value) + 1;
		}
		return ans;
	}

	// for test
	public static void printArray(int[] arr) {
		for (int i = 0; i != arr.length; i++) {
			System.out.print(arr[i] + " ");
		}
		System.out.println();
	}

	public static void main(String[] args) {
		int len = 50;
		int value = 100;
		int testTime = 500000;
		System.out.println("test begin");
		for (int i = 0; i < testTime; i++) {
			int[] arr = generatePositiveArray(len, value);
			int K = (int) (Math.random() * value) + 1;
			int ans1 = getMaxLength(arr, K);
			int ans2 = right(arr, K);
			if (ans1 != ans2) {
				System.out.println("Oops!");
				printArray(arr);
				System.out.println("K : " + K);
				System.out.println(ans1);
				System.out.println(ans2);
				break;
			}
		}
		System.out.println("test end");
	}

}